2012-07-10 11 views
5

Duplicar posibles:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?C++ error de la herencia cuando el objeto se le asigna en la pila

tengo pequeña muestra de código:

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 

    void print() 
    { 
    cout << "Hello" << endl; 
    } 

}; 

class B: public A 
{ 

    public: 

    B() { cout << "Creating B" << endl;} 

}; 


int main() 
{ 

    B b(); 

    b.print(); // error: request for member ‘print’ in ‘b’, which is of non-class type ‘B()()’ 



} 

Sin embargo si cambio a la uno a continuación, si funciona,

B* b = new B(); 

b->print(); 

¿Por qué no funciona cuando asigno el objeto en la pila?

Respuesta

9

Porque B b(); declara una función llamada b que devuelve B. Solo use B b; y culpe al hecho de que C++ tiene una gramática compleja que hace que este tipo de construcciones sea complicado.

4

B b(); declara una función llamada b que no toma nada y devuelve B. ¿Sorprendente? Trate de cambiar el nombre de su clase B como Int, y el nombre de su "objeto" f. Ahora parece que

Int f(); 

parece más una función, ¿o no?

Para definir un objeto predeterminado-construida, es necesario:

B b; 

En caso de operator new, el constructor por defecto se puede llamar con o sin paréntesis:

B* b = new B; 
B* b = new B(); 
Cuestiones relacionadas