2013-03-29 12 views
7

Ho esaminato alcune altre domande a riguardo, ma non vedo perché nel mio caso debba essere chiamato un costruttore predefinito. Potrei semplicemente fornire un costruttore predefinito, ma voglio capire perché sta facendo questo e ciò che colpisce."Nessun costruttore predefinito appropriato disponibile" - Perché il costruttore predefinito è anche chiamato?

error C2512: 'CubeGeometry' : no appropriate default constructor available 

Ho una classe denominata ProxyPiece con si suppone che una variabile membro del costruttore CubeGeometry.The a prendere in un CubeGeometry e assegnarlo alla variabile membro. Ecco l'intestazione:

#pragma once 
#include "CubeGeometry.h" 

using namespace std; 
class ProxyPiece 
{ 
public: 
    ProxyPiece(CubeGeometry& c); 
    virtual ~ProxyPiece(void); 
private: 
    CubeGeometry cube; 
}; 

e la fonte:

#include "StdAfx.h" 
#include "ProxyPiece.h" 

ProxyPiece::ProxyPiece(CubeGeometry& c) 
{ 
    cube=c; 
} 


ProxyPiece::~ProxyPiece(void) 
{ 
} 

l'intestazione per la geometria del cubo assomiglia a questo. Non ha senso per me usare un costruttore predefinito. Ho bisogno in ogni modo ?:

#pragma once 
#include "Vector.h" 
#include "Segment.h" 
#include <vector> 

using namespace std; 

class CubeGeometry 
{ 
public: 
    CubeGeometry(Vector3 c, float l); 

    virtual ~CubeGeometry(void); 

    Segment* getSegments(){ 
     return segments; 
    } 

    Vector3* getCorners(){ 
     return corners; 
    } 

    float getLength(){ 
     return length; 
    } 

    void draw(); 

    Vector3 convertModelToTextureCoord (Vector3 modCoord) const; 

    void setupCornersAndSegments(); 

private: 
    //8 corners 
    Vector3 corners[8]; 

    //and some segments 
    Segment segments[12]; 

    Vector3 center; 
    float length; 
    float halfLength; 
}; 

risposta

22

vostro costruttore di default è implicitamente chiamato qui:

ProxyPiece::ProxyPiece(CubeGeometry& c) 
{ 
    cube=c; 
} 

Volete

ProxyPiece::ProxyPiece(CubeGeometry& c) 
    :cube(c) 
{ 

} 

caso contrario, il ctor è equivalente a

ProxyPiece::ProxyPiece(CubeGeometry& c) 
    :cube() //default ctor called here! 
{ 
    cube.operator=(c); //a function call on an already initialized object 
} 

La cosa dopo i due punti si chiama memberinitialization list.

Per inciso, vorrei prendere l'argomento come const CubeGeometry& c invece di CubeGeomety& c se fossi in te.

+3

Per essere ancora più chiaro, forse potresti, nel tuo "è uguale a" snippet, cambiare 'cube = c;' in 'cube.operator = (c);'. Aiuterebbe a spiegare che il compito non reintegra (da una prospettiva linguistica) 'cube'. – hvd

+0

@hvd: accettato, modifica –

+0

Quindi tutti i costruttori predefiniti di qualsiasi variabile membro vengono chiamati prima del costruttore nella classe contenitore? (e sì lo renderò un const :)) – AAB

4

L'inizializzazione del membro si verifica all'avvio del costruttore. Se non si fornisce un inizializzatore nell'elenco di inizializzazione dei membri del costruttore, il membro verrà creato come predefinito. Se si desidera copiare costruttore da utilizzare per inizializzare il membro cube, utilizzare l'elenco di inizializzazione di membri:

ProxyPiece::ProxyPiece(CubeGeometry& c) 
    : cube(c) 
{ } 

Tutto dopo i due punti è la lista di inizializzazione. Questo semplicemente dice che cube deve essere inizializzato con c.

Come avete avuto, il membro cube stato di default inizializzato e poi c stato copia assegnato ad esso.

+0

Vedo, grazie per la spiegazione degli elenchi di inizializzazione/assegnazione delle copie! – AAB

Problemi correlati