2013-03-29 20 views
7

Bu konuyla ilgili başka birkaç soruya da baktım, ancak davamda neden varsayılan bir kurucunun bile çağrılacağını anlamıyorum. Sadece bir varsayılan kurucu sağlayabilirdim, ancak bunun neden bunu yaptığını ve neyin etkilediğini anlamak istiyorum."Uygun varsayılan kurucu yok" - Varsayılan kurucu neden çağrılıyor?

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

Ben CubeGeometry.The yapıcı bir üyesi değişkeni CubeGeometry almak ve üye değişkeni atamak gerekiyordu ile ProxyPiece adlı bir sınıf var.

#pragma once 
#include "CubeGeometry.h" 

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

ve kaynak:

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

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


ProxyPiece::~ProxyPiece(void) 
{ 
} 

küp geometri için üst bilgisi aşağıdaki gibidir Burada başlıktır. Varsayılan bir kurucu kullanmak benim için mantıklı değil. Ben onun gerek musunuz ?:

Varsayılan yapıcı örtülü burada denir
#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; 
}; 

cevap

22

: Aksi takdirde ctor

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

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

} 

istiyorum

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

Kolondan sonraki şey memberinitialization list olarak adlandırılır.

Bu arada, siz ben olsaydım, CubeGeomety& c yerine const CubeGeometry& c argümanını alırdım.

+3

Daha net olmak gerekirse, belki de "snippet ile aynıdır" ifadesini kullanarak, "cube = c;", "cube.operator = (c);" ifadesini kullanabilirsiniz. Ödevin (bir dil açısından) “küp” ü yeniden başlatmamasını açıklamaya yardımcı olur. – hvd

+0

@hvd: üzerinde anlaşılmış, düzenleme –

+0

Bu nedenle, herhangi bir üye değişkeninin tüm varsayılan kurucuları, yapıcıdan önce içeren sınıfa çağrılır mı? (ve evet bir const yapacağım :)) – AAB

4

Kurucu başlatıldığında üye başlatma gerçekleşir. Kurucunun üye başlatma listesinde bir başlatıcı sağlamazsanız, üye varsayılan olarak yapılandırılacaktır. Eğer üye cube başlatmak için kullanılacak yapıcı kopyalamak istiyorsanız, üye başlatma listesini kullanmak: kolon aşağıdaki

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

Herşey başlatma listesidir. Bu sadece cube'un c ile başlatılması gerektiğini söylüyor. Onu alır gibi

, cube üyesi birinci varsayılan başlatıldı ve ardından c kendisinekopyasını atandı.

+0

Anladığım kadarıyla, açılış listelerinin/kopyalama ödevinin açıklaması için teşekkürler! – AAB