2010-05-17 8 views
1

J'ai un objet global "X" et une classe "A". J'ai besoin d'une fonction F dans A qui a la capacité de modifier le contenu de X.Modifier un objet sans l'utiliser comme paramètre

Pour une raison quelconque, X ne peut pas être un membre de données de A (mais A peut contenir un membre Y comme référence de X), et aussi, F ne peut avoir aucun paramètre, donc je ne peux pas passer X comme un paramètre dans F. (Ici A est un dialogue et F est un slot sans aucun paramètre, comme accept())

Comment puis-je modifier X dans F si je ne peux pas y insérer X? Est-il possible de laisser A savoir que "X" est l'objet qu'il doit modifier? J'essaie d'ajouter quelque chose comme SetItem pour spécifier X dans A, mais échoué.

Répondre

4

Si vous ne voulez pas F à la référence X globalement, alors vous pouvez « ensemble » sur l'objet avant d'appeler la méthode « travailleur ». Par exemple.

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

Voilà ce que je veux faire, merci: D –

+0

Qu'en est-il de la contrainte que "X ne peut pas être un membre de données de A"? –

+0

A contient x par valeur, donc cela ne permet pas à X de modifier l'objet, comme requis par l'OP. La variable membre doit être modifiée pour être de type X * - mais alors F() doit gérer le cas où le pointeur est nul, c'est-à-dire que SetX() n'a pas encore été appelé. –

1

Puisque X est un objet global, vous devriez pouvoir y accéder à partir de A :: F().
Par exemple:

En Bh:

class B 
{ 
public: 
    B(){x=1}; 
    virtual ~B(){} 
    ChangeSomething(){x=2;} 
private: 
    int x; 
}; 

Dans main.cpp

#include "A.h" 
#include "B.h" 

B X; 

int main(int argc, const char* argv[]) 
{ 
    A instanceOfA; 
    instanceOfA.ModifyGlobalObject(); 
} 

en Ah

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

Bien sûr ces classes et les variables globales peuvent être différentes fichiers si vous incluez les en-têtes correctement.

+0

Désolé je devrais le rendre plus clair. Ils sont dans un fichier source différent, par exemple, "A" est dans main.c, et F est dans A.c. Et je ne veux pas laisser A.c inclure main.c juste à cause de la variable globale X. –

+0

Vous ne pourrez pas appeler 'ChangeSomething()' car c'est une méthode privée de 'B'. –

+0

La fonction F = ChangeSomething() est publique, donc cette partie est OK. Mais je ne veux pas laisser A.h comprend main.c ou d'autres en-têtes –

0

Si X est global, vous pouvez le définir dans la fonction A :: F.

extern X 

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

Désolé, je devrais le rendre plus clair. Ils sont dans un fichier source différent, par exemple, "A" est dans main.c, et F est dans A.c. Et je ne veux pas laisser A.c pour inclure main.c juste à cause de la variable globale X. –

Questions connexes