修改对象而不将其用作参数

时间:2010-05-17 23:41:44

标签: c++ qt qt4

我有一个全局对象“X”和一个类“A”。 我需要A中的函数F,它能够修改X的内容。

由于某种原因,X不能是A的数据成员(但是A可以包含一些成员Y作为X的引用),而且,F不能有任何参数,所以我不能将X作为参数传递给F.(这里A是一个对话框,F是没有任何参数的插槽,例如accept())

如果我不能将X传入其中,如何修改F中的X?有没有办法让A知道“X”是需要修改的对象?我尝试添加诸如SetItem之类的东西来在A中指定X,但是失败了。

3 个答案:

答案 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;
   }
};