C ++ – Comment appeler une classe / un object créateur

J’ai besoin d’appeler les propriétés et les fonctions d’un object d’une autre classe.

L’idée est de transmettre ‘this’ en tant que paramètre au constructeur de l’autre classe. Par exemple:

instance = ClassName(this); 

Et ensuite faire:

 ParentClass parentInstance; ClassName::ClassName(MainApp _instance){ parentInstance = _instance; } 

Cependant, mon compilateur dit que ParentClass ne nomme pas un type. Des idées? Aussi, devrais-je utiliser un pointeur pour économiser de la mémoire? Comment?

Merci d’avance.


METTRE À JOUR:

Ok, désolé pour le retard. Voici le code actuel. Tout d’abord, un cours simple.

Classe de jeu:

header de fichier

 #ifndef _GAME #define _GAME #include "ofMain.h" class Game{ public: Game(); ~Game(); void hi(); }; #endif 

fichier cpp:

 #include "Game.h" Game::Game(){} Game::~Game(){} void Game::hi(){ cout << "hi, I'm game! " << endl; } 

Ensuite, à partir de MainApp, je crée l’object: – Code pertinent dans le fichier d’en-tête:

 #ifndef _MAIN_APP #define _MAIN_APP #include "ofMain.h" #include "Game.h" class MainApp : public ofSimpleApp{ public: Game game; }; #endif 

Code pertinent sur le fichier cpp:

 game = Game(); game.hi(); 

Cela fonctionne évidemment car je ne fais que créer un object sanglant. Cependant, le problème vient avec la composition.

Je pouvais passer l’application principale en tant qu’argument dans le constructeur, via Game.setParent (this); … le problème est que je ne peux même pas définir la variable pour stocker la référence à l’application.

Par exemple: (le rendant facile / inefficace sans pointeurs ou quoi que ce soit)

Game.h:

 #define _GAME #ifndef _GAME #include "ofMain.h" #include "MainApp.h" class Game{ MainApp app; public: Game(); ~Game(); void hi(); }; #endif 

Cela retourne une erreur “ne nomme pas un type” et la déclaration de la class MainApp renvoie une erreur “type incomplet”

Je suis sûr que je fais quelque chose de stupide.


MISE À JOUR 2:

Le problème avec cette méthode est que je ne peux pas appeler une fonction de l’object pointé maintenant.

C’est Game.h:

 #ifndef _GAME #define _GAME #include "ofMain.h" class MainApp; class Game{ public: Game(); Game(MainApp* _app); ~Game(); void hi(); MainApp* app; }; #endif 

Comme vous le voyez, app (du type MainApp) est passé en paramètre. C’est bien, MainApp existe car c’est la déclaration anticipée. Cependant, lorsque j’essaie d’appeler l’une des fonctions de l’application, je ne peux pas (erreur du compilateur disant Demande de membre appHi dans …. qui est de type non-classe ‘MainApp’.

MainApp N’EST PAS inclus dans Game.h, mais Game.h EST inclus dans MainApp.h.

Des idées?

Le problème est que vous avez une référence circulaire – le jeu inclut MainApp et MainApp comprend le jeu. Vous avez besoin d’une “déclaration”, comme dans l’exemple de DeadMG.

Voir ici

Je pense qu’il peut y avoir deux problèmes ici:

1) Vous devez déclarer le ParentClass (ig #include son fichier .hpp) avant de l’utiliser

2) L’affectation “parentInstance = _instance” appellera l’opérateur d’affectation, ce qui, je suppose, n’est pas ce que vous voulez. laissez “parentInstance” être un pointeur à la place.

Notez la section sur “#include”. http://www.cplusplus.com/doc/tutorial/program_structure/

Après la section “Introduction au langage C ++”, recherchez le texte à propos de #include. http://www.cprogramming.com/tutorial/lesson1.html

Espaces de nommage: http://www.tenouk.com/Module23.html

HTH

Ce n’est pas comme ça que ça marche en C ++. Contrairement à javascript, vous ne pouvez pas injecter de méthodes ni de champs dans des objects existants au moment de l’exécution.

C’est ce qu’on appelle la composition et est un modèle commun. Il est très efficace tant sur le plan sémantique que sur le plan de la vitesse d’exécution / de la mémoire.

Votre exemple de code est un peu trop pseudocode pour que je puisse le lire correctement. Laisse-moi te montrer comment c’est fait.

 class X; class Y { ... void DoSomething(X* x, ... args); }; class X { Y y; void DoSomething() { y.DoSomething(this, args); } }; 

Madsen est sur la bonne voie, mais nous avons besoin de plus de code. Quelle est la hiérarchie de classe de ParentClass, ClassName et SaleraApp. Quelles classes sont basiques et / ou déviées?

Lorsque vous écrivez: parentInstance = _instance; le compilateur essaiera de générer un constructeur de copie par défaut s’il n’en est pas défini. Votre problème est peut-être que vous essayez de créer un object de classe dévié à partir d’un pointeur de classe de base.

En outre, “ceci” est un pointeur.

Si tout ce que vous avez à faire est d’utiliser les fonctions et les données membres d’une autre classe, lisez le mot-clé friend . Cela permettra l’access aux membres des classes d’autres classes.

UPDATE: Vous pouvez également stocker un pointeur ou une référence sur l’object auquel vous devez accéder, créer des getters pour les membres de données et rendre les fonctions publiques …