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

时间:2016-06-11 22:29:11

标签: c++ class templates object

我正在尝试更改对象内部的类的私有变量,该变量在该类中初始化。 我的意图可以从下面的简单例子中得出。 从Increment调用的obj应该会增加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()

有没有办法可以实现这一点而不将其作为参数传递?

2 个答案:

答案 0 :(得分:1)

1,东西不是静态的公共成员,所以它不能直接通过ClassName ::,你要使用“BaseClass :: stuff ++”来实现,请把它改为静态公共,这使得所有的对象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拥有的东西更好。

答案 1 :(得分: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;
}