2010-12-11 5 views
1

Ich bin in C++ codieren, und ich habe private Daten Mitglieder in der Header-Datei einer Klasse.Objekt Initialisierungsproblem in C++ Header-Datei

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

Also nimmt das zweite Objekt einen Zeiger auf das erste Objekt. Wenn ich versuche, das Programm zu kompilieren, erhalte ich folgende Fehlermeldung:

„erwartete Kennung vor‚&‘token“

Gibt es eine Möglichkeit, die Objekte innerhalb dieser Klasse Konstruktor in der Implementierungsdatei zu instanziiert eher als seine Definition? Wie behebe ich diesen Fehler? Das Programm wird nicht kompiliert.

Antwort

1

Was Ihr Compiler Ihnen mit diesem Fehler sagt, ist th Sie versuchen, eine Methode namens obj2 zu erstellen, die eine Object2 zurückgibt, die eine Referenz als Parameter verwendet. Aber es kann nicht herausfinden, was der Typ der Referenz ist.

Auf der anderen Seite, wenn Sie die Referenz vor dem Bau des Objekts festlegen möchten Sie so etwas schreiben kann:

Object2* obj2 = &obj1; 

bearbeiten

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

Ihr Programm machen Kompilieren ist nicht immer die beste Lösung, vielleicht gibt es einen Grund, warum es nicht kompiliert wird, und Sie müssen verstehen, warum es so ist. Einfach den Fehler zu korrigieren hilft vielleicht nicht bei der Ursache. Wie Nawaz im Kommentar darauf hingewiesen hat, wenn die Typen Object1 und Object2 unterschiedlich sind, ist es möglich, dass das, was Sie versuchen, nicht das Richtige ist.

+0

Danke.Das hat das Problem behoben. – user246392

+0

Ihr Willkommen, wenn dies Ihr Problem gelöst hat, bitte als beantwortet markieren. – ALOToverflow

+0

... was ist, wenn 'Object2' einen völlig anderen Typ als' Object1' hat? – Nawaz

1

Sie können nicht so schreiben:

Object2 obj2(&obj1); 

Verwenden Konstruktor Objekte zu initialisieren, wie folgt aus:

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

Lies dies im Detail zu verstehen:

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

+0

Wie gebe ich dann einen Zeiger auf obj2 innerhalb der Kopfzeile? – user246392

+0

Sie nicht, es sei denn, Sie definieren den Körper des Konstruktors in der Kopfzeile, die im Allgemeinen nicht empfohlen wird. – suszterpatt

+0

Der Compiler hat ihm das schon gesagt. Warum sagst du ihm nicht warum? Er kann nicht? –

2

In C++ können Sie Member nicht als Teil der Klassendefinition initialisieren.

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

Dies erzeugt eine Warnung wird in der Regel wird aber in Ordnung sein, solange obj2 nicht seine Konstruktorargument bis zum Bau von myClass abgeschlossen ist nicht verwendet: Diese Art der Operation sollte im Konstruktor erfolgen.

0

Sie können solchen Mitgliedern in ihrer Deklaration keine Werte zuweisen. Sie müssen das im Konstruktor der Klasse tun.

MyClass 
{ 
    private: 
     Object1 obj1; 
     Object2 obj2; 

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

Dies wird fehlschlagen, wenn Objekt2 keinen Standardkonstruktor zur Verfügung hat. Und wird es zweimal initialisieren, wenn es das tut. –