2010-12-11 70 views
1

Je code en C++ et j'ai des membres de données privés dans le fichier d'en-tête d'une classe.Problème d'initialisation d'objet dans le fichier d'en-tête C++

private: 
     Object1 obj1; 
     Object2 obj2(&obj1); 

Ainsi, le deuxième objet prend un pointeur vers le premier objet. Lorsque je tente de compiler le programme, je reçois l'erreur suivante:

« identifiant attendu avant « & » jeton » constructeur

Est-il possible d'instancier les objets à l'intérieur de cette classe dans le fichier de mise en œuvre plutôt que sa définition? Comment corriger cette erreur? Le programme ne compilera pas.

Répondre

1

Ce que votre compilateur vous dit avec cette erreur est à vous essayez de faire une méthode appelée obj2, renvoyant un Object2 qui prend une référence en tant que paramètre. Mais il ne peut pas comprendre quel est le type de la référence.

D'autre part, si vous souhaitez définir la référence avant la construction de l'objet que vous pouvez écrire quelque chose comme ceci:

Object2* obj2 = &obj1; 

Modifier

How do I correct this error? The program won't compile.

Faire votre programme compiler n'est pas toujours la meilleure solution, peut-être qu'il y a une raison pour laquelle il ne compilera pas et vous devez comprendre pourquoi c'est le cas. Il suffit de corriger l'erreur pour ne pas aider votre cause. Comme Nawaz l'a souligné dans le commentaire, si les types Object1 et Object2 sont différents, il est possible que ce que vous essayez de faire ne soit pas la bonne chose.

+0

Merci.Cela a réglé le problème. – user246392

+0

Votre bienvenue, si cela a résolu votre problème, s'il vous plaît marquer comme répondu. – ALOToverflow

+0

... et si 'Object2' est un type complètement différent de' Object1'? – Nawaz

1

Vous ne pouvez pas écrire comme ceci:

Object2 obj2(&obj1); 

Utilisez constructeur pour initialiser des objets, comme ceci:

class Sample 
{ 
private: 
     Object1 obj1; 
     Object2 obj2; 
public: 
    Sample(Object1 o1) : obj1(o1), obj2(&o1) 
    { 
    } 
}; 

Lisez ceci pour comprendre en détail:

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

+0

Ensuite, comment puis-je passer un pointeur sur obj2 dans l'en-tête? – user246392

+0

Vous ne le faites pas, sauf si vous définissez le corps du constructeur dans l'en-tête, ce qui n'est généralement pas recommandé. – suszterpatt

+0

Le compilateur lui a déjà dit cela. Pourquoi ne pas lui dire * pourquoi * il ne peut pas? –

2

En C++, vous ne pouvez pas initialiser les membres dans le cadre de la définition de classe. Ce type d'opération devrait se faire dans le constructeur:

myClass() : obj2(& (this->obj1)) { ... } 

Cela va générer généralement un avertissement, mais sera bien aussi longtemps que obj2 n'utilise pas son argument constructeur jusqu'à la construction de myClass est terminée.

0

Vous ne pouvez pas affecter des valeurs à des membres comme cela dans leur déclaration. Vous devrez le faire dans le constructeur de la classe.

MyClass 
{ 
    private: 
     Object1 obj1; 
     Object2 obj2; 

    public: 
     MyClass() 
     { 
      obj2 = Object2(&obj1); 
     } 
}; 
+4

Cela échouera si Object2 n'a pas de constructeur par défaut disponible. Et l'initialisera deux fois si c'est le cas. –