我正在尝试更改对象内部的类的私有变量,该变量在该类中初始化。
我的意图可以从下面的简单例子中得出。
从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()
。
有没有办法可以实现这一点而不将其作为参数传递?
答案 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;
}