我有一个全局对象“X”和一个类“A”。 我需要A中的函数F,它能够修改X的内容。
由于某种原因,X不能是A的数据成员(但是A可以包含一些成员Y作为X的引用),而且,F不能有任何参数,所以我不能将X作为参数传递给F.(这里A是一个对话框,F是没有任何参数的插槽,例如accept())
如果我不能将X传入其中,如何修改F中的X?有没有办法让A知道“X”是需要修改的对象?我尝试添加诸如SetItem之类的东西来在A中指定X,但是失败了。
答案 0 :(得分:4)
如果您不希望F全局引用X,那么您可以在调用“worker”方法之前在对象上“设置”它。 E.g。
class A
{
public:
A() : member_x(NULL) { }
void SetX(X* an_x) { member_x = an_x; }
void F(); { member_x->Manipulate(); }
private:
X* member_x;
};
X global_x;
A global_a;
void DoStuff()
{
global_a.SetX(&global_x);
global_a.F();
}
答案 1 :(得分:1)
由于X是一个全局对象,你应该能够从A :: F()中访问它 例如:
在B.h:
class B
{
public:
B(){x=1};
virtual ~B(){}
ChangeSomething(){x=2;}
private:
int x;
};
在main.cpp
中#include "A.h"
#include "B.h"
B X;
int main( int argc, const char* argv[] )
{
A instanceOfA;
instanceOfA.ModifyGlobalObject();
}
在A.h
#include "B.h"
extern B X;
class A
{
public:
ModifyGlobalObject(){X.ChangeSomething();}
};
当然,如果正确包含标题,这些类和全局变量可以位于不同的文件中。
答案 2 :(得分:0)
如果X是全局的,你可以在A :: F函数中设置它。
extern X
class A
{
void F()
{
// set the global variable X
X = someValue;
}
};