2009-04-02 4 views
23

sto cercando di definire il costruttore e distruttore della mia classe, ma continuo a ricevere l'errore di compilazione:C++ errore relativo alla definizione del costruttore/distruttore

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

Che cosa significa?

Parte del codice:

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

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

Come sono strutturati i file (* .h, * .cpp)? In quale file è inserito il codice? – paxdiablo

risposta

43

nella dichiarazione della classe (probabilmente in un file di intestazione) è necessario disporre di qualcosa di simile:

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

di lasciare che il compilatore si sa don Non voglio le versioni predefinite generate dal compilatore (dato che le stai fornendo).

Probabilmente ci sarà molto di più nella dichiarazione, ma almeno ne avrete bisogno - e questo vi farà iniziare.

Si può vedere questo utilizzando il molto semplice:

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

compilazione che e funziona. Quindi rimuovere la linea con l'indicatore di commento e compilare di nuovo. Vedrete i vostri problemi appaiono quindi:

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

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

+0

Grazie. Questo era esattamente il problema. –

+0

@ MB, stavo lavorando a un test prog mentre rispondevi, quindi ho pensato di aggiungerlo invece di fare una risposta competitiva che dicesse la stessa cosa. Poi ho upvoted la tua risposta molto migliore :-) – paxdiablo

+0

Conciso e preciso ... molto ben fatto. – ojblass

1

Un'altra cosa da tenere a mente è che tutto ciò che il costruttore accede deve essere pubblico. Ho ricevuto questo errore prima.

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

Questo codice hanno ancora l'errore perché nel mio costruttore ho avuto il seguente:

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

Il che significava che anche se avevo fatto il costruttore e distruttore pubblico, i dati che stavano lavorando con era ancora privato, e ho ancora l'errore "definizione di implicitamente dichiarato".

+1

Questo non è affatto corretto. Il costruttore può accedere a qualsiasi variabile membro privata, e di solito è molto del suo lavoro. –

+0

Sì, il costruttore può accedere a qualsiasi variabile membro privata, ma ** solo della propria classe. ** Ciò significa che se il proprio costitutore vuole accedere alle variabili private dei dati T * dovrebbe essere pubblico. – taronish4