如何从类内实例化的对象访问私有变量
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 试图接近 BaseClass1、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 拥有的东西更好。
【讨论】:
以上是关于如何从类内实例化的对象访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章