如何从类内实例化的对象访问私有变量

Posted

技术标签:

【中文标题】如何从类内实例化的对象访问私有变量【英文标题】:How to access private variable from object instantiated inside class 【发布时间】:2016-06-11 22:29:10 【问题描述】:

我正在尝试更改对象内部类的私有变量,该对象在该类内部初始化。 我的意图可以从下面的简单示例中得出。 从obj 调用的Increment 应该增加BaseClass::stuff

template <typename ObjectType>
class BaseClass
 public:

  int Increment()
    return obj.Increment();
  

 private:
  int stuff = 0;
  ObjectType obj;
;

class ObjectType
  public:     
   int Increment ()
   
      return BaseClass<ObjectType>::stuff++;
   ;
;

int main () 
  BaseClass<ObjectType> base;
  base.Increment(); // should increase stuff by 1;

我能想到的一种方法是将内容作为参数传递给obj.Increment()

有没有一种方法可以在不将其作为参数传递的情况下实现这一点?

【问题讨论】:

使用friend关键字? 一个对象不知道它属于哪个对象。如果你添加这些知识,你通常会得到非常脆弱的代码。 【参考方案1】:

您的示例有一些错误。 修复并添加 friend 说明符后,它应该如下所示:

template <typename ObjectType>
class BaseClass
public:
    friend ObjectType;

    int Increment()
        return obj.Increment();
    

private:
    static int stuff;
    ObjectType obj;
;

template<typename T>
int BaseClass<T>::stuff = 0;

class ObjectType
public:     
    int Increment ()
    
        return BaseClass<ObjectType>::stuff++;
    ;
;

int main () 
    BaseClass<ObjectType> base;
    base.Increment(); // should increase stuff by 1;

【讨论】:

我试过运行代码,没有成功。 ObjectType 试图接近 BaseClass::stuff (不是实例化对象)似乎是问题我该如何解决这个问题? 答案中的代码在clang 和GCC 上编译。我没有得到你的评论,抱歉。 哦,我错过了 template int BaseClass::stuff = 0 部分。谢谢:)【参考方案2】:

1、stuff不是静态public成员,所以不能直接用ClassName::实现,id要使用"BaseClass::stuff++",请将其改为static public,这样所有的objects的 BaseClass 共享一个东西。

2,否则,ObjectType 需要“知道”BaseClass,ObjectType::Increment 可以通过 BaseClass 的一些帮助功能增加 BaseClass 的内容,或者使 ObjectType 成为 BaseClass 的朋友。

ObjectType 自己的 BaseClass 的示例代码:

template <typename ObjectType>
class BaseClass
public:
    void increaseStuff() ++stuff;
.... 


class ObjectType

    BaseClass<ObjectType>& itsBase;
public:    
    ObjectType(BaseClass<ObjectType>& base) : itsBase(base) 
    int Increment ()
    
       return itsBase.increaseStuff();
    ;
;

但我觉得这个设计看起来很奇怪,意思是“我想通过别人改变我拥有的东西”,为什么不直接改变我的东西。 在这种情况下,我认为 ObjectType 拥有的东西更好。

【讨论】:

以上是关于如何从类内实例化的对象访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章

读取外部类的隐藏私有字段

python 面向对象的三大特性之一: 封装

如何在 Obj-C 或 Swift 中访问私有实例变量?

调用函数从类返回私有变量不起作用

C ++无法从类中检索私有变量[关闭]

私有变量和特权方法