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部分。谢谢:)