如何访问对象的私有成员?

Posted

技术标签:

【中文标题】如何访问对象的私有成员?【英文标题】:How can I access an object's private members? 【发布时间】:2013-12-30 06:03:37 【问题描述】:

假设我有一个包含成员对象的类:

class Class1

    private:
        Class2 anObject;

还有一个整数变量和另一个类中的访问器:

class Class2

    private:
        int aVariable;
    public:
        int getAVariable()
        
             return aVariable;
        

从 main 访问 aVariable 的最佳方式是什么?

例如,如果 anObject 被声明为 public 而不是 private,我可以在 main 中这样做:

int main()

    Class1 Class1Object;
    cout << Class1Object.anObject.getAVariable() << '\n';

但是如果anObject 保持私密,我该怎么做呢?

【问题讨论】:

好像还有更好的设计,不过main可以加好友。 我认为你应该阅读更多关于 OOP 原则的内容.. @chris 这听起来比仅仅添加一个吸气剂要糟糕得多。 如果你只是想打印出来,只需将operator&lt;&lt;重载为Class1 首先,你明白private的全部意思吗? 【参考方案1】:

你有两个选择:

class Class1

    public:
        int getAVariable()                   //Option 1, Get the int directly
        
            return anObject.getAVariable()
        
        Class2 getAnObject()                 //Option 2, Get a copy of the object
                                            
            return anObject
         
    private:
        Class2 anObject;

选项 1:是 AboutAverage 建议的。但是,如果您在 Class2 中有多个私人成员,那么您将需要为 Class1 中的每个成员提供一个访问器

选项 2:aafonso1991 刚刚击败了我。它返回anObject 的副本,因此Class1 中的anObject 仍然没有被修改。这是更好的 OO 选择,因为您不需要创建额外的函数并保存这些代码行。尽管 Class2 特别大并且复制它很昂贵,但这可能是运行时的问题。在这种情况下,您可以为Class1 的常用成员创建类似 option1 的访问器

【讨论】:

【参考方案2】:

在第 1 类中为您想要的对象获取一个公共 getter。

public:
    Class2 getObject()
    
         return anObject;
    

然后你就可以了

 int main()


Class1 Class1Object;
cout << Class1Object.getObject().getAVariable() << '\n';

【讨论】:

封装是关于让字段是私有的,并使它们只能通过 getter 读取,并通过 setter 进行修改。.. 嗯,这很有趣。感谢 aafonso1991 的建议。 我的另一个想法是简单地从 Class1 扩展 Class2。然后从 Class1 (Class1Object) 创建的对象将有权访问 getAVariable() 函数。 如果 Class2 具有相似的行为和字段,您只想从 Class1 扩展 Class2。假设 Class1 是“动物”而 class2 是“狗”,那么您应该使用继承,因为狗是动物并且它也具有动物所具有的属性......但是如果 Class1 和 Class2 不共享任何东西共同点(即 class1 是“鲨鱼”而 class2 是“狗”,那么它们不应该相互继承,因为鲨鱼具有与狗不同的方法......但它们都可以扩展动物类因为它们都是动物……”) 好的,有道理。再次感谢 aafonso。【参考方案3】:

在这种情况下,您可以在 Class1 上定义一个访问器(get 函数),它只返回在 Class2 上调用 getAVariable() 的结果。

【讨论】:

我在想这个,但看起来很奇怪。简单地声明一个对象不是更好吗? @navig8tr 首先将其声明为私有的原因是什么? @navig8tr - 私有它可以是 a) 只读的。 b)被计算或只是一个值(取决于类的实现) @JimBalter:演示封装。这是给学校的。 @navig8tr 你说你把它设为私有是为了实现封装——如果它是公共的,那么它就不再被封装了。

以上是关于如何访问对象的私有成员?的主要内容,如果未能解决你的问题,请参考以下文章

子类如何访问父类

朋友类对象可以在其成员函数中访问派生类对象上的基类私有成员吗?

如何从头文件中访问类的私有成员?

C++ - 使用 std::list,如何打印对象私有成员的链表?

成员修饰符知识点

通过反射访问父类的私有成员