2015-12-04 8 views
5

Mi stavo chiedendo, perché non riesco a chiamare un costruttore. Anche questo piccolo esempio non riesce a compilare con il messaggio:C++ Impossibile chiamare il costruttore direttamente nel piccolo esempio

Klassentest.cpp:24:27: error: cannot call constructor 'Sampleclass::Sampleclass' directly [-fpermissive] 

Codice:

#include <iostream> 
using namespace std; 

class Sampleclass 
{ 
    public: 
    Sampleclass(); 
}; 

Sampleclass::Sampleclass(){ 

} 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    Sampleclass::Sampleclass() *qs = new Sampleclass::Sampleclass(); 
    return 0; 
} 

ho usato il compilatore g ++ Cygwin nella versione 4.9.3-1.

Grazie per il vostro aiuto.

+0

Cosa stai cercando di fare? Perché stai usando 'new'? Inoltre, non è possibile chiamare direttamente un costruttore in C++. – TartanLlama

+3

Sono solo C++ ... i costruttori non sono funzioni regolari.Vedi [this] (http://stackoverflow.com/questions/33079486/difference-between-constructor-calls-with-and-without/33079632) domanda e risposta –

+0

Ho bisogno di avere un oggetto sull'heap, non lo stack . Questo è solo un piccolo esempio in cui ho anche il problema. – GlenM

risposta

5
Sampleclass::Sampleclass() *qs = new Sampleclass::Sampleclass(); 

è errato. Sampleclass è un mentre Sampleclass::Sampleclass è un costruttore . Dal momento che la sintassi corretta è

type identifier = new type(); 

è necessario specificare il tipo di qui.

Pertanto utilizzare

Sampleclass *qs = new Sampleclass(); 

invece.


Note:

  • Se non lo sapeva: dal C++ 11 si può semplicemente fare

    Sampleclass() = default; 
    

    nella definizione della classe e sarà definito il costruttore di default .

+0

Ancora meglio, usa 'Sampleclass * qs = new Sampleclass();' ' –

+0

@ ErikAlapää Oh crap, grazie. – Downvoter

1
#include <iostream> 
using namespace std; 

class Sampleclass 
{ 
public: 
    Sampleclass(); 
}; 

Sampleclass::Sampleclass(){ 

} 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 
    Sampleclass *qs = new Sampleclass::Sampleclass(); 
    return 0; 
} 

si è tentato di fare riferimento al costruttore come un tipo quando si crea un'istanza della classe.

3

Sì, non è possibile chiamare direttamente il direttore.

dalla norma, $ 12.1/2 Costruttori [class.ctor]

Poiché i costruttori non hanno nomi, non sono mai trovata durante ricerca del nome;

Si potrebbe desiderare

Sampleclass *qs = new Sampleclass; 

Poi sarà chiamato il ctor.

Problemi correlati