Est-il possible de déclarer un objet d'une classe avant la création de la classe en C++? Je demande parce que j'essaye d'employer deux classes, le premier doit avoir une instance de la deuxième classe dedans, mais la deuxième classe contient également une instance de la première classe. Je me rends compte que vous pouvez penser que je pourrais entrer dans une boucle infinie, mais j'ai vraiment besoin de créer et d'instance de la deuxième classe avant le premier cours.Déclarer un objet avant même que cette classe ne soit créée
Répondre
Vous ne pouvez pas faire quelque chose comme ceci:
class A {
B b;
};
class B {
A a;
};
Le problème le plus évident est le compilateur ne sait pas grand, il doit faire la classe A, car la taille B dépend de la taille de A!
Vous pouvez cependant faire:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
Déclarant classe B comme une déclaration avant vous permet d'utiliser des pointeurs (et références) à cette classe sans avoir encore la définition toute la classe.
Vous ne pouvez pas déclarer une instance d'une classe non définie mais vous pouvez déclarer un pointeur une:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Est-ce à ce que vous voulez: La première classe contient la deuxième classe, mais la deuxième classe (qui doit être créée en premier) a juste une référence à la première classe?
Je suis en train d'essayer de faire l'inverse, où la première classe référence la deuxième classe et la deuxième classe contient une instance de la première classe. –
Ceci est appelé référence croisée. Voir here un exemple.
Il existe an elegant solution utilisant des modèles.
template< int T > class BaseTemplate {}; typedef BaseTemplate<0> A; typedef BaseTemplate<1> B; // A template<> class BaseTemplate<0> { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate<1> { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
Ce code fonctionne! Alors, pourquoi fonctionne-t-il? La raison a à voir avec la façon dont les modèles sont compilés. Les modèles retardent la création de la fonction signatures jusqu'à ce que vous utilisiez le modèle quelque part. Cela signifie que ni getA() ni getB() n'aura leurs signatures analysées avant qu'après les deux classes A et B ont déjà été déclarées. C'est la magie de cette méthode.
Intéressant (bien qu'il contienne plusieurs fautes de frappe). Mais le 'getA' et le 'getB' sont vraiment des usines: ils renvoient de nouvelles instances (en valeur). Une instance de A n'a pas de B et une instance de B n'a pas de A. – jwfearn
- 1. C#: Notification avant que WeakReference ne soit collecté?
- 2. Déclarer un objet avant de l'initialiser en C++
- 3. Puis-je cibler un élément avant qu'il ne soit fermé?
- 4. Javascript sur la page ne s'exécute pas avant que l'événement AJAX onComplete soit appelé
- 5. Comment utiliser jQuery avant qu'il ne soit référencé?
- 6. Formulaires C# - la forme du dialogue ne disparaît que partiellement avant que la mesure suivante ne soit prise
- 7. Est-il nécessaire que quelqu'un soit inscrit à un événement avant de pouvoir le faire?
- 8. HOWTO: spécifiez-vous dans app.config pour appeler une fonction avant que Main() ne soit appelée?
- 9. Contrôle utilisateur ASP.NET: Page_Load déclenche avant que la propriété ne soit définie
- 10. comment exécuter une fonction JS avant que la requête AJAX ne soit lancée avec remote_form_for
- 11. Jquery - Arrête de cliquer avant que le document ne soit prêt
- 12. Puis-je avoir un objet avec le même nom que la classe dans javascript?
- 13. Est-ce que cette classe est threadsafe?
- 14. comment déclarer un dossier à l'intérieur d'une classe OCAML
- 15. Comment définir un global avant que le test de squelette de PHPUnit soit exécuté
- 16. Comment éviter qu'un objet ne soit déposé dans un TileList par un autre en utilisant Flex?
- 17. Comment déclarer une structure dans une classe?
- 18. Javascript: déclarer une variable avant le résultat conditionnel?
- 19. Comment déclarer une classe enfant en tant que propriété d'une classe parent à utiliser dans des classes enfants apparentées?
- 20. Obliger un objet SimpleXML à une chaîne, quel que soit le contexte
- 21. Comment déclarer un énumérateur TDictionary?
- 22. Ne veut pas que le formulaire soit réduit
- 23. Java: Utiliser un actionlistener pour appeler une fonction dans une autre classe sur un objet de cette classe
- 24. Comment crypter un objet java.util.Properties (quelle que soit sa taille) à l'aide d'une clé publique RSA?
- 25. Comment "cloner" un objet dans un objet de sous-classe?
- 26. passer un objet [] à un objet params [] ne fonctionne pas
- 27. En jQuery Form, 'succès' est appelé avant que 'beforeSubmit' soit terminé
- 28. Comment empêcher la soumission de formulaire avant que DOM soit prêt?
- 29. ASP.NET MVC Ajax ActionLink OnComplete callback invoqué avant que le remplacement soit terminé?
- 30. Comment gedit édite-t-il et sauvegarde-t-il un gros fichier avant que le chargement du fichier ne soit terminé?
... ou une référence à un: MyClass & rMyObject; –