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

How to access private variable from object instantiated inside class

本文关键字:访问 对象 变量 实例化      更新时间:2023-10-16

我正在尝试更改对象内类的私有变量,该变量在该类中初始化。我的意图可以从下面的简单例子中得出。从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说明符后,它应如下所示:

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;
}

> 1、东西不是静态的公共成员,所以不能直接通过 ClassName::来实现,你想用 "BaseClass::stuff++" 的 id ,请改成静态公共的,这样 BaseClass 的所有对象共享一个东西。

2、否则,ObjectType 需要"知道"BaseClass,ObjectType::Increment 可以通过 BaseClass 的一些帮助功能来增加 BaseClass 的东西,或者让 ObjectType 成为 BaseClass 的朋友。

ObjectType own 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 拥有的东西更好。