2013-03-29 14 views
7

मैंने इसके बारे में कुछ अन्य प्रश्नों को देखा है, लेकिन मुझे नहीं पता कि मेरे मामले में एक डिफ़ॉल्ट कन्स्ट्रक्टर को क्यों बुलाया जाना चाहिए। मैं सिर्फ एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान कर सकता था, लेकिन मैं समझना चाहता हूं कि यह क्यों कर रहा है और यह क्या प्रभावित करता है।"कोई उचित डिफ़ॉल्ट कन्स्ट्रक्टर उपलब्ध नहीं है" - डिफ़ॉल्ट कन्स्ट्रक्टर को क्यों बुलाया जाता है?

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

मैं एक वर्ग CubeGeometry.The निर्माता के एक सदस्य चर एक CubeGeometry में लेने के लिए और सदस्य चर निर्दिष्ट करने के लिए माना जाता है के साथ ProxyPiece कहा जाता है।

#pragma once 
#include "CubeGeometry.h" 

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

और स्रोत:

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

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


ProxyPiece::~ProxyPiece(void) 
{ 
} 

घन ज्यामिति के लिए शीर्ष लेख इस तरह दिखता है यहाँ शीर्ष लेख है। यह डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करने के लिए मुझे समझ में नहीं आता है। मैं वैसे भी आवश्यकता क्यों है यह ?:

#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; 
}; 

उत्तर

22

आपकी डिफ़ॉल्ट निर्माता परोक्ष यहाँ कहा जाता है:

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

आप

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

} 

चाहते अन्यथा अपने ctor

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

कोलन के बाद चीज memberinitialization list कहा जाता है।

संयोग से, मैं CubeGeomety& c के बजाय const CubeGeometry& c के रूप में तर्क लेता हूं यदि मैं आप थे।

+3

यहां तक ​​कि स्पष्ट होने के लिए, शायद आप अपने "स्निपेट के समान" हो सकते हैं, 'cube = c;' 'cube.operator = (c);' में बदलें। इससे यह समझने में मदद मिलेगी कि असाइनमेंट (भाषा परिप्रेक्ष्य से) 'क्यूब' को फिर से शुरू नहीं करता है। – hvd

+0

@hvd: –

+0

संपादित करने पर सहमत हुए, तो किसी भी सदस्य चर के सभी डिफॉल्ट कन्स्ट्रक्टर को कन्स्ट्रक्टर से पहले कक्षा में बुलाया जाता है? (और हाँ मैं इसे एक स्थिर बना दूंगा :)) – AAB

4

सदस्य प्रारंभ तब होता है जब निर्माता शुरू होता है। यदि आप निर्माता के सदस्य प्रारंभिक सूची में प्रारंभकर्ता नहीं प्रदान करते हैं, तो सदस्य डिफ़ॉल्ट रूप से निर्मित होंगे। आप निर्माता कॉपी करने के लिए सदस्य cube प्रारंभ करने में इस्तेमाल किया जा करना चाहते हैं, सदस्य प्रारंभ सूची का उपयोग करें:

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

सब कुछ पेट के निम्नलिखित आरंभ सूची है। यह बस कहता है कि cubec के साथ शुरू किया जाना चाहिए।

आप इसे था, cube सदस्य पहले डिफ़ॉल्ट प्रारंभ किया गया और फिर c सौंपा इसे करने के लिएनकल किया गया था।

+0

मैं देखता हूं, प्रारंभिक सूचियों/कॉपी असाइनमेंट की व्याख्या के लिए धन्यवाद! – AAB

संबंधित मुद्दे