2010-05-17 3 views
1

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

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

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

ответ

4

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

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

Вот что я хочу сделать, спасибо: D –

+0

Как насчет ограничения, что «X не может быть членом данных A»? –

+0

Удерживает x по значению, поэтому это не позволяет X изменять объект, как требуется OP. Переменная-член должна быть изменена на тип X *, но тогда F() должен обрабатывать случай, когда указатель имеет значение null, т. Е. SetX() еще не был вызван. –

1

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

В Bh:

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

в Ач

#include "B.h" 
extern B X; 
class A 
{ 
public: 
    ModifyGlobalObject(){X.ChangeSomething();} 
}; 

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

+0

Извините, я должен сделать это более понятным. Они находятся в другом исходном файле, например, «A» находится в main.c, а F - в A.c. И я не хочу, чтобы A.c включал main.c только из-за глобальной переменной X. –

+0

Вы не сможете вызвать 'ChangeSomething()', поскольку это частный метод 'B'. –

+0

Функция F = ChangeSomething() является общедоступной, поэтому эта часть в порядке. Но я не хочу, чтобы A.h включал main.c или другие заголовки –

0

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

extern X 

class A 
{ 
    void F() 
    { 
     // set the global variable X 
     X = someValue; 
    } 
}; 
+0

Извините, я должен сделать это более понятным. Они находятся в другом исходном файле, например, «A» находится в main.c, а F - в A.c. И я не хочу, чтобы A.c включил main.c только из-за глобальной переменной X. –

Смежные вопросы