2011-04-23 7 views

Respuesta

49

Olvidó declarar el constructor en la definición de la clase. Hacedlo saber en public sector de la clase (si desea que los clientes crean ejemplo de usarlo):

class classA 
{ 
     public: 
       classA(); // you forgot this!  
     protected: 
       void setX(int a); 

     private: 
       int p; 
}; 

Ahora usted puede escribir su definición fuera de la clase que ya has hecho.

+0

En realidad, lo que sé es que el compilador proporciona el constructor predeterminado de manera predeterminada. Aquí mencionó que faltaba la definición del constructor. Pero, no sabía el 'POR QUÉ' tenemos que proporcionar el constructor predeterminado cuando ya está siendo proporcionado por el compilador. Pero, ahora, sabía que si estamos definiendo el constructor predeterminado que no está de acuerdo con el proporcionado por el compilador, tendremos que definirlo explícitamente. No encontré el 'POR QUÉ'. :) – Chaitanya

+0

@Chaitanya: El compilador genera un constructor predeterminado para usted si usted no declara (y define) uno usted mismo. En la pregunta, el OP ha intentado definir el constructor predeterminado fuera de la clase, sin declararlo en la clase. El código está mal formado y el compilador generará un error. Avíseme si lo entiende ahora ** (vea el código en la pregunta para entenderlo completamente) **. – Nawaz

+0

Tengo el punto ahora. Entonces, es como una vez que definimos un constructor predeterminado, eso tiene que ser declarado. De lo contrario, uno estará allí por defecto. Muchas gracias :) – Chaitanya

6
class classA 
{     
     protected: 
       classA(); // you were missing an explicit declaration! 
       void setX(int a); 

     private: 
       int p; 
}; 

classA:: classA() 
{ 
p = 0; 
} 
+1

no me downvote, pero su falta de declaración debería ser 'public' no 'protected' –

+2

@Binary ¿por qué echo de menos' public'? Un objeto de la clase no se crea fuera de 'classA' o una de sus clases derivadas (de las cuales no hay ninguna). Claramente, la clase ya está diseñada para ser derivada de, porque 'setX' está protegido. –

1

classA no tiene un elemento llamado classA() de implementar.

class classA 
{ 
    // .... 
    public: 
     classA() ; // Missing the declaration of the default constructor. 
}; 
0

Un constructor vacío se proporciona por defecto: esto es correcto. Pero si lo redefines, ya no es un constructor predeterminado. Tienes que declararlo y definirlo. Si solo lo declaras (sin el cuerpo), es incorrecto: debes definirlo también. Si lo defines sin una declaración en la clase, también es un error. Puede, sin embargo, "combinar" declaración y definición por escrito de la siguiente manera:

class classA 
{ 
    // .... 
    public: 
     classA() { p = 0;} 
}; 

o en este caso aún mejor:

class classA 
{ 
    // .... 
    public: 
     classA():p(0) {} 
}; 
Cuestiones relacionadas