Изменить объект, не используя его в качестве параметра - PullRequest
1 голос
/ 18 мая 2010

У меня есть глобальный объект "X" и класс "A". Мне нужна функция F в A, которая может изменять содержимое X.

По какой-то причине X не может быть элементом данных A (но A может содержать некоторый элемент Y в качестве ссылки на X), а также, F не может иметь никаких параметров, поэтому я не могу передать X в качестве параметра в F. ( Здесь A - это диалог, а F - это слот без каких-либо параметров, таких как accept ())

Как я могу изменить X внутри F, если я не могу передать X в него? Есть ли способ сообщить A, что «X» - это объект, который нужно изменить? Я пытаюсь добавить что-то вроде SetItem, чтобы указать X в A, но не получилось.

Ответы [ 3 ]

4 голосов
/ 18 мая 2010

Если вы не хотите, чтобы F ссылался на X глобально, то вы могли бы «установить» его на объекте перед вызовом метода «worker». Э.Г.

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 голос
/ 18 мая 2010

Поскольку X является глобальным объектом, вы должны иметь к нему доступ из A :: F ().
Например:

В Б.ч .:

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();}
};

Конечно, эти классы и глобальные переменные могут находиться в разных файлах, если вы правильно включите заголовки.

0 голосов
/ 18 мая 2010

Если X является глобальным, вы можете установить его в функции A :: F.

extern X

class A
{
   void F()
   {
        // set the global variable X
        X = someValue;
   }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...