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

C++ 如何从类内实例化的对象访问私有变量,c++,class,templates,object,C++,Class,Templates,Object,我试图在一个对象内更改一个类的私有变量,该变量在该类内初始化。 我的意图可以从下面的简单例子中看出。 从obj调用的增量应增加BaseClass::stuff template <typename ObjectType> class BaseClass{ public: int Increment(){ return obj.Increment(); } private: int stuff = 0; ObjectType obj; }; class

我试图在一个对象内更改一个类的私有变量,该变量在该类内初始化。 我的意图可以从下面的简单例子中看出。 从
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;
}
模板
类基类{
公众:
int增量(){
返回obj.Increment();
}
私人:
int=0;
对象类型obj;
};
类对象类型{
公众:
整数增量()
{
返回基类::stuff++;
};
};
int main(){
基类基类;
base.Increment();//应将填充值增加1;
}
我可以想到的一种方法是将内容作为参数传递给
obj.Increment()


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

1,stuff不是静态公共成员,因此它不能直接通过ClassName:,id实现,如果您想使用“BaseClass::stuff++”,请将其更改为静态公共,这将使BaseClass的所有对象共享一个stuff

2、否则,ObjectType需要“知道”基类,ObjectType::Increment可以通过基类的一些帮助函数增加基类的内容,或者使ObjectType成为基类的朋友

ObjectType自身基类的示例代码:

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();
    };
};
模板
类基类{
公众:
void increaseStuff(){++stuff;}
.... 
}
类对象类型
{
基类&itsBase;
公众:
ObjectType(基类和基):itsBase(基)
整数增量()
{
返回其base.increaseStuff();
};
};
但我觉得这个设计似乎很奇怪,它的意思是“我想通过别人改变我拥有的东西”,为什么不直接改变我的东西呢。
在这种情况下,我认为ObjectType拥有的东西更好。

您的示例有一些错误。
一旦修复并添加了
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;
}
模板
类基类{
公众:
友元对象类型;
int增量(){
返回obj.Increment();
}
私人:
静态int-stuff;
对象类型obj;
};
模板
int BaseClass::stuff=0;
类对象类型{
公众:
整数增量()
{
返回基类::stuff++;
};
};
int main(){
基类基类;
base.Increment();//应将填充值增加1;
}

使用
friend
关键字?对象不知道它是什么对象的一部分。如果你添加这些知识,你通常会得到非常脆弱的代码。我试过运行代码,但没有成功。ObjectType试图接近BaseClass::stuff(它不是一个实例化的对象)似乎是我如何解决这个问题的问题?答案中的代码同时编译on和。对不起,我没有收到您的评论。哦,我错过了模板int BaseClass::stuff=0部分。谢谢:)