2012-07-10 10 views
5

Eventuali duplicati:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?C++ errore ereditarietà quando l'oggetto viene allocato sullo stack

Ho piccolo esempio di codice:

#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()()’ 



} 

Tuttavia se cambio al uno sotto, se funziona,

B* b = new B(); 

b->print(); 

Perché non funziona quando alloco l'oggetto nello stack?

risposta

9

Perché B b(); dichiara una funzione denominata b che restituisce un B. Basta usare B b; e dare la colpa al fatto che C++ abbia una grammatica complessa che rende complicato questo tipo di costrutto.

4

B b(); dichiara una funzione denominata b che non richiede nulla e restituisce B. Sorprendente? Prova a rinominare la classe B come Int e denominare il tuo "oggetto" f. Ora sembra

Int f(); 

sembra più una funzione, non è vero?

Per definire un oggetto predefinito-costruito, è necessario:

B b; 

In caso di operator new, il costruttore di default possono essere chiamati con o senza parentesi:

B* b = new B; 
B* b = new B(); 
Problemi correlati