2009-04-02 20 views
23

Estoy tratando de definir el constructor y el destructor de mi clase, pero sigo obteniendo el error de compilación:C++ error relacionado con la definición del constructor/destructor

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

¿Qué significa?

parte del código:

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

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

¿Cómo se estructuran sus archivos (* .h, * .cpp)? ¿En qué archivo está el código publicado? – paxdiablo

Respuesta

43

En la declaración de clase (probablemente en un fichero de cabecera) es necesario tener algo que se parece a:

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

para dejar que el compilador sabe Don No quiero las versiones generadas por el compilador por defecto (ya que las estás proporcionando).

Probablemente habrá más en la declaración que eso, pero necesitará al menos eso, y esto lo ayudará a comenzar.

Esto se puede ver con la muy simple:

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

compilar ese y funciona. A continuación, elimine la línea con el marcador de comentarios y vuelva a compilar. Vas a ver sus problemas aparecen a continuación:

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

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

+0

Gracias. Este fue exactamente el problema. –

+0

@MB, estaba trabajando en un programa de prueba mientras respondía, así que pensé que lo agregaría en lugar de hacer una respuesta que dijera lo mismo. Luego volví a subir tu respuesta mucho mejor :-) – paxdiablo

+0

concisa y precisa ... muy bien hecho. – ojblass

1

Otra cosa a tener en cuenta es que todo lo que tenga acceso al constructor debe ser pública. He recibido este error antes.

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

Este código todavía tiene el error porque en mi constructor que tenía la siguiente:

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

Lo que significaba que aunque yo había hecho público constructor y el destructor, los datos que estaban trabajando con todavía estaba privado, y todavía tengo el error de "definición de implícitamente declarado".

+1

Esto no es correcto en absoluto. El constructor puede acceder a cualquier variable miembro privada, y para hacerlo suele ser una gran parte de su trabajo. –

+0

Sí, el constructor puede acceder a cualquier variable miembro privada, pero ** solo de su propia clase. ** Esto significa que si su constuctor quiere acceder a las variables privadas de los datos T *, debe ser público. – taronish4

Cuestiones relacionadas