Questions tagged «private-members»

在面向对象的编程中,私有成员是只能从类本身内部访问的那些数据字段,属性或类的方法。


25
从原型定义的函数访问私有成员变量
有什么方法可以使“私有”变量(在构造函数中定义的变量)可供原型定义的方法使用? TestClass = function(){ var privateField = "hello"; this.nonProtoHello = function(){alert(privateField)}; }; TestClass.prototype.prototypeHello = function(){alert(privateField)}; 这有效: t.nonProtoHello() 但这不是: t.prototypeHello() 我习惯于在构造函数中定义方法,但出于以下两个原因而逐渐远离它。


10
为什么专用字段专用于类型而不是实例专用?
在C#(和许多其他语言)中,访问相同类型其他实例的私有字段是完全合法的。例如: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if (anotherFoo.aBool) ... } } 正如C#规范(第3.5.1节,第3.5.2节)所述,对私有字段的访问是基于类型而不是实例。我一直在与一位同事讨论这个问题,我们正试图提出一个使其如此工作的原因(而不是限制对同一实例的访问)。 我们能想到的最好的参数是进行相等性检查,其中类可能要访问私有字段以确定与另一个实例的相等性。还有其他原因吗?还是某些绝对地意味着它必须像这样工作的黄金原因,否则将完全不可能?

4
为什么可以在私有类型上使用auto?
我惊讶地发现以下代码可以编译并运行(vc2012&gcc4.7.2) class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; // Foo::Bar b = f.Baz(); // error auto b = f.Baz(); // ok std::cout << b.i; } 这段代码编译正确吗?为什么正确呢?为什么我auto不能使用它的名称(如预期的那样)而使用私有类型?


7
为什么同一类的对象可以访问彼此的私有数据?
为什么同一类的对象可以访问彼此的私有数据? class TrivialClass { public: TrivialClass(const std::string& data) : mData(data) {}; const std::string& getData(const TrivialClass& rhs) const { return rhs.mData; }; private: std::string mData; }; int main() { TrivialClass a("fish"); TrivialClass b("heads"); std::cout << "b via a = " << a.getData(b) << std::endl; return 0; } 此代码有效。对象a完全有可能从对象b访问私有数据并将其返回。为什么会这样呢?我认为私有数据是私有的。(我首先尝试了解pimpl习惯用法中的副本构造函数,但后来发现我什至不了解这种简单情况。)

11
CoffeeScript中的私人成员?
有人知道如何在CoffeeScript中成为私有的非静态成员吗​​?目前,我正在执行此操作,该操作仅使用以下划线开头的公共变量来阐明不应在类外使用它: class Thing extends EventEmitter constructor: (@_name) -> getName: -> @_name 将变量放在类中使其成为静态成员,但是如何使其变为非静态呢?甚至有可能没有得到“幻想”?

25
我可以在不使用朋友的情况下从班级外部访问私人成员吗?
免责声明 是的,我完全意识到我的要求完全是愚蠢的,任何想在生产代码中尝试这种事情的人都应该被开除和/或开枪。我主要是看是否可以完成。 既然这已经成为现实,有什么办法可以从类外部访问C ++中的私有类成员?例如,有没有办法用指针偏移量做到这一点? (欢迎使用天真的和其他非生产就绪技术) 更新资料 如评论中所述,我之所以问这个问题,是因为我想写一篇有关过度封装(以及它如何影响TDD)的博客文章。我想看看是否有一种方法可以说“即使在C ++中,使用私有变量也不是100%可靠的强制封装方法”。最后,我决定将重点更多地放在解决问题的方法上,而不是解决问题的原因,因此,我没有像计划中那样突出此处提出的一些内容,但我仍然留下了联系。 无论如何,如果有人对它的发布方式感兴趣,那就是: 测试驱动开发的敌人:第一部分:封装(建议您在决定疯了之前先阅读它)。

14
隐藏C结构中的成员
我一直在阅读有关C语言中的OOP的知识,但我从未喜欢过如何像C ++中那样拥有私有数据成员。但是后来我想到可以创建2个结构。一个在头文件中定义,另一个在源文件中定义。 // ========================================= // in somestruct.h typedef struct { int _public_member; } SomeStruct; // ========================================= // in somestruct.c #include "somestruct.h" typedef struct { int _public_member; int _private_member; } SomeStructSource; SomeStruct *SomeStruct_Create() { SomeStructSource *p = (SomeStructSource *)malloc(sizeof(SomeStructSource)); p->_private_member = 42; return (SomeStruct *)p; } 从这里您可以将一个结构转换为另一个结构。这被认为是不良做法吗?还是经常做?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.