2009-04-02 11 views
23

próbuję zdefiniować konstruktora i destruktora mojej klasie, ale wciąż otrzymuję błąd:C++ kompilowanie błędów związanych z definicji konstruktora/destruktora

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

Co to znaczy?

część kodu:

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

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

W jaki sposób są uporządkowane twoje pliki (* .h, * .cpp)? W którym pliku jest ten opublikowany kod? – paxdiablo

Odpowiedz

43

W deklaracji klasy (prawdopodobnie w pliku nagłówkowym) trzeba mieć coś, co wygląda jak:

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

Aby pozwolić kompilator wiedzieć don nie chcę domyślnych wersji generowanych przez kompilator (od kiedy je dostarczasz).

Prawdopodobnie będzie więcej zgłoszeń niż to, ale będziesz potrzebować przynajmniej tych - a to pomoże Ci zacząć.

Widać to przy użyciu bardzo prosty:

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

Kompilacja że i to działa. Następnie usuń linię ze znacznikiem komentarza i skompiluj ponownie. Zobaczysz wtedy pojawiają się problemy:

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

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

+0

Dziękuję. To był dokładnie problem. –

+0

@MB, pracowałem nad programem testowym, podczas gdy ty odpowiadałeś, więc pomyślałem, że dodam go, zamiast tworzyć konkurencyjną odpowiedź, która mówi to samo. Potem przegłosowałem twoją znacznie lepszą odpowiedź :-) – paxdiablo

+0

Zwięzłe i dokładne ... bardzo dobrze zrobione. – ojblass

1

Inną rzeczą, aby pamiętać, że wszystko, co konstruktor dostęp musi być publiczny. Dostałem ten błąd wcześniej.

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

Kod ten wciąż ma błąd, ponieważ w moim konstruktora miałem następujące:

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

Co oznaczało, że chociaż ja miałem konstruktora i destruktora publicznego, dane były pracy z wciąż prywatny i nadal mam "definicję domyślnie zadeklarowanego" błędu.

+1

To nie jest poprawne. Konstruktor może uzyskać dostęp do dowolnej prywatnej zmiennej członkowskiej, a do tego zazwyczaj należy. –

+0

Tak, konstruktor może uzyskać dostęp do dowolnej prywatnej zmiennej członkowskiej, ale ** tylko do własnej klasy. ** Oznacza to, że jeśli twój constuktor chce uzyskać dostęp do prywatnych zmiennych danych T *, powinien być publiczny. – taronish4

Powiązane problemy