我试图找出最合理,最安全,最有效的方法来实现这一点,而不使用全局变量。
假设我有一个班级:
class SomeClass{
public: someFunction(){...}
};
另一个类将SomeClass
实例化为数据成员:
class AnotherClass{
SomeClass theTest;
void anotherFunction(){...}
int myDataInt;
};
现在,我希望someFunction
中的SomeClass
能够轻松访问myDataInt
中的AnotherClass
。一种方法是将int
参数添加到someFunction
传递的AnotherClass
。也许这是唯一可行的方法。但我希望在someFunction
和myDataInt
之间进行更“自动”的访问。另一种选择是让AnotherClass
中的SomeClass
设置数据等于其自己的myDataInt
。但后来我有两个类存储相同的数据,这似乎是多余的。
还有其他建议吗?非常感谢。
答案 0 :(得分:3)
在AnotherClass
中添加指向SomeClass
的指针:
class SomeClass{
AnotherClass* enclosing;
public:
someFunction(){
int x=enclosing->myDataInt;
...
}
};
编辑:此外,正如上面的iammilind所述,您希望SomeClass
成为AnotherClass
的朋友或拥有myDataInt
的访问者方法。
答案 1 :(得分:1)
一个类应该负责它自己的状态,因此你希望每个类成员都是私有的,并提供访问它们的接口(成员方法)。
如果AnotherClass和SomeClass只在彼此之间共享一些字段,我将不会如此轻松地介绍friend
。更好的设计总是试图将数据隐藏在外面。
我对你的问题的解决方案是SomeClass拥有一个指向AnotherClass的指针,然后在需要时访问它的成员方法:
class AnotherClass;
class SomeClass
{
public:
SomeClass(AnotherClass* p) : context_ptr_(p) {}
void someFunction();
{
context_ptr_->setDataInt(3);
}
private:
AnotherClass *context_ptr_;
};
class AnotherClass
{
public:
AnotherClass() :theTest(this)
{
}
void anotherFunction(){ }
void setDataInt(int i) { myDataInt = i; }
private:
SomeClass theTest;
int myDataInt;
};
答案 2 :(得分:0)
你可以这样做:
class SomeClass{
public:
SomeClass( int & refInt )
: sharedInt(refInt)
{}
int & sharedInt;
};
在AnotherClass
:
class AnotherClass {
public:
AnotherClass()
: theTest(myDataInt)
{}
private:
SomeClass theTest;
int myDataInt;
};