2009-04-02 4 views
23

Ich versuche, den Konstruktor und Destruktor meiner Klasse zu definieren, aber ich erhalte immer die Fehlermeldung:C++ Fehler Konstruktor/Destruktor Definition im Zusammenhang Kompilieren

definition of implicitly-declared 'x::x()'

Was bedeutet das?

Teil des Codes:

///Constructor 
StackInt::StackInt(){ 
    t = (-1); 
    stackArray = new int[20]; 
}; 

///Destructor 
StackInt::~StackInt(){ 
    delete[] stackArray; 
} 
+0

Wie sind Ihre Dateien strukturiert (* .h, * .cpp)? In welcher Datei ist der Code gespeichert? – paxdiablo

Antwort

43

In der Klassendeklaration (wahrscheinlich in einer Header-Datei) müssen Sie etwas haben, das wie folgt aussieht:

class StackInt { 
public: 
    StackInt(); 
    ~StackInt(); 
} 

der Compiler informieren Sie don Ich möchte nicht die vom Compiler generierten Standardversionen (da Sie sie bereitstellen).

Es wird wahrscheinlich mehr zu der Deklaration als das, aber Sie brauchen mindestens diese - und das wird Ihnen den Anfang machen.

Sie können dies sehen durch die sehr einfach mit:

class X { 
     public: X(); // <- remove this. 
}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

dass Kompilieren und es funktioniert. Dann entferne die Zeile mit dem Kommentarmarker und kompiliere erneut. Sie werden Ihre Probleme sehen erscheinen dann:

class X {}; 
X::X() {}; 
int main (void) { X x ; return 0; } 

 
qq.cpp:2: error: definition of implicitly-declared `X::X()' 

+0

Danke. Das war genau das Problem. –

+0

@MB, Ich arbeitete an einem Testprogramm, während Sie antworteten, also dachte ich, ich würde es hinzufügen, anstatt eine konkurrierende Antwort zu machen, die dasselbe sagte. Dann habe ich deine viel bessere Antwort aufgezogen :-) – paxdiablo

+0

Prägnant und genau ... sehr gut gemacht. – ojblass

1

Eine andere Sache im Auge zu behalten ist, dass alles, was der Konstruktor greift öffentlich sein muss. Ich habe diesen Fehler schon einmal bekommen.

class X{ 
    T *data; 
public:  // <-move this to include T * 
    X(); 
    ~X(); 
} 

Dieser Code hat immer noch den Fehler, da in meinem Konstruktor ich folgendes hatte:

X::X(){data = new T(); 

Was das bedeutete, obwohl ich hatte den Konstruktor und Destruktor Öffentlichkeit, die Daten, die sie arbeiten gemacht noch war privat, und ich habe immer noch die "Definition von implizit deklarierten" Fehler.

+1

Dies ist überhaupt nicht korrekt. Der Konstruktor kann auf jede private Mitgliedsvariable zugreifen, und dies ist in der Regel ein großer Teil seiner Arbeit. –

+0

Ja, der Konstruktor kann auf jede private Membervariable zugreifen, aber ** nur auf seine eigene Klasse. ** Dies bedeutet, dass Ihr Konstruktor, wenn er auf die privaten Variablen der T * -Daten zugreifen möchte, öffentlich sein soll. – taronish4