2010-07-06 7 views
1

Avertissement: Il s'agit probablement d'une question très stupide.Classes et mise à jour des données

J'ai un objet qui réside dans son propre fichier d'en-tête et qui est créé dans main, je voudrais mettre à jour ledit objet en utilisant une fonction qui est déclarée dans un fichier séparé. Si je ne suis pas clair s'il vous plaît faites le moi savoir et je vais essayer de m'expliquer mieux.

//main 
#include"Object.h" 
int main(){ 
    Object obj; 
} 

Supposons que ce qui précède est le principal, et obj est créé.

//functions file which is separate from both the main and object.h 
void updateObj(int someNum){ 
    //how can I do this?? 
    obj.callingObject(someNum); 
} 

Merci

+0

Je savais que c'était une question stupide la minute je l'ai écrit, complètement oublié que je peux utiliser extern ou envoyer l'objet en tant que paramètre de fonction. Merci pour toutes les réponses. – kenshee

Répondre

0

La réponse est simple, car le code est écrit - vous ne pouvez pas. Vous devez rendre l'objet global:

#include"Object.h" 

Object obj; 

void updateObj(int someNum){ 
    extern Object obj; 
    obj.callingObject(someNum); 
} 


int main(){ 
    updateObj(42); 
} 

Mais vous ne voulez vraiment pas le faire.

2

L'objet que vous déclarez dans main est dans la portée de main. Par conséquent "updateObj" ne peut pas y avoir accès. L'un des éléments suivants ferait ce travail:

// This (IMO) is a wrong way. Unless perhaps obj is a singleton and then you should just make it such. 
//main 
Object obj; 
int main() 
{ 
} 

// functions file 
extern Object obj; 
void updateObj(int someNum) 
{ 
    obj.callingObject(somenum) 
} 

Une autre façon serait d'écrire:

+1

Deuxième option de code est mieux, IMO. – FrustratedWithFormsDesigner

+0

Oui, d'accord. À moins que Object ne soit un singleton, mais vous voudriez alors passer à travers la difficulté de l'implémenter comme tel, en utilisant peut-être l'implémentation singleton de Loki. –

0

Vous pourriez faire obj une approche globale:

// Object.h 
//... 
extern Object g_obj; 

et:

// functions file 
void updateObj(int someNum){ 
    g_obj.callingObject(someNum); 
} 

Mais une approche ch qui serait plus préférable est de passer une référence à un Object à updateObj:

// functions file 
void updateObj(Object& obj, int someNum){ 
    obj.callingObject(someNum); 
} 
0

C'est mauvais style, car il suppose que l'utilisateur de votre fichier d'en-tête sait qu'il doit être un objet magique appelé obj qui obtient changé sans qu'il sache.

Je pense que ce que vous essayez est une sorte de modèle de conception "singleton". C'est assez commun, donc google devrait apporter beaucoup de bons résultats. Une autre méthode consiste à instancier l'objet dans Object.h, de sorte que la personne qui l'inclut et votre fichier d'en-tête puissent le voir.

Si vous insistez, vous pouvez inclure votre main.cpp dans votre fichier d'en-tête, assurez-vous simplement de protéger vos en-têtes.

0

obj est visible uniquement dans la portée de main, donc cela ne fonctionnera pas. Une façon de corriger: réécrire la fonction de prendre comme paramètre une référence à l'objet que vous souhaitez modifier:

void updateObj(Object& obj, int someNum) { 
    obj.callingObject(someNum); 
} 

puis passer obj à lui de main. Vous devrez également ajouter obj à toutes les fonctions intermédiaires.

Autre façon: faites de obj une variable globale.Si obj doit être construit à partir main, faire obj un Object* et l'initialiser à partir main:

int main() { 
    obj = new Object; 
} 
+0

En supposant que la fonction est appelée dans un fichier séparé pas principal comment serais-je en mesure d'utiliser l'objet, en plus d'utiliser un objet global? Je présume qu'il serait préférable pour moi de redessiner la plupart de mes classes plutôt que d'utiliser des globals. – kenshee

+0

Je souscris à l'opinion selon laquelle il est normal de rendre les choses globales à l'échelle mondiale, mais il vaut mieux qu'elles soient bonnes! Les singletons sont parfois utilisés à la place des globals mais ils sont effectivement la même chose. Sinon, vous devez passer obj autour des fonctions/objets qui en ont besoin. Un modèle que j'ai vu est d'avoir un objet "context" qui contient toutes les variables qui pourraient être globales, de sorte que 1) vous n'avez pas besoin de tous les threads séparément et 2) vous pouvez passer un nouveau contexte lorsque vous appelez quelqu'un sans vous affecter ni vos appelants. –

Questions connexes