प्रत्यायोजित कंस्ट्रक्टर का उपयोग करते हुए सदस्य आरंभीकरण


96

मैंने C ++ 11 मानक को आज़माना शुरू कर दिया है और मुझे यह सवाल मिला है जो बताता है कि कैसे एक intor विधि या इस तरह से बचने के लिए उसी कक्षा में दूसरे ctor से अपने ctor को कॉल करें। अब मैं कोड के साथ एक ही चीज़ की कोशिश कर रहा हूँ जो इस तरह दिखता है:

HPP:

class Tokenizer
{
public:
  Tokenizer();
  Tokenizer(std::stringstream *lines);
  virtual ~Tokenizer() {};
private:
  std::stringstream *lines;
};

सीपीपी:

Tokenizer::Tokenizer()
  : expected('=')
{
}

Tokenizer::Tokenizer(std::stringstream *lines)
  : Tokenizer(),
    lines(lines)
{
}

लेकिन यह मुझे त्रुटि दे In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegationरहा है : मैंने सूची में पहले और अंत में टोकनिनेज़र () भाग को स्थानांतरित करने की कोशिश की है, लेकिन इससे कोई मदद नहीं मिली।

इसके पीछे क्या कारण है और मुझे इसे कैसे ठीक करना चाहिए? मैंने इसके बजाय lines(lines)शरीर के साथ जाने की कोशिश की है this->lines = lines;और यह ठीक काम करता है। लेकिन मैं वास्तव में शुरुआती सूची का उपयोग करने में सक्षम होना चाहूंगा।

जवाबों:


118

जब आप सदस्य आरंभीकरण को किसी अन्य कंस्ट्रक्टर को सौंपते हैं, तो एक धारणा है कि अन्य कंस्ट्रक्टर ऑब्जेक्ट को पूरी तरह से इनिशियलाइज़ करता है , जिसमें सभी सदस्य (यानी linesआपके उदाहरण में सदस्य भी शामिल हैं )। इसलिए आप किसी भी सदस्य को फिर से इनिशियलाइज़ नहीं कर सकते।

मानक से प्रासंगिक उद्धरण है (जोर मेरा):

(Initial12.6.2 / 6) एक मेमर्स-इनिशियलाइज़र-सूची किसी भी वर्ग-या-घोषणा पत्र का उपयोग करके निर्माता के वर्ग के किसी अन्य निर्माता को सौंप सकती है जो निर्माता के वर्ग को ही दर्शाता है। यदि एक मेम-इनिशियलाइज़र-आईडी कंस्ट्रक्टर के वर्ग को नामित करता है, तो यह एकमात्र मेम-इनिशियलाइज़र होगा ; कंस्ट्रक्टर एक डेलीगेटिंग कंस्ट्रक्टर है, और कंस्ट्रक्टर द्वारा चयनित टारगेट कंस्ट्रक्टर है। [...]

आप काम के आसपास कर सकते हैं इस निर्माता कि तर्क लेता है के संस्करण को परिभाषित करते हुए पहले :

Tokenizer::Tokenizer(std::stringstream *lines)
  : lines(lines)
{
}

और फिर डेलिगेशन का उपयोग करके डिफॉल्ट कंस्ट्रक्टर को परिभाषित करें:

Tokenizer::Tokenizer()
  : Tokenizer(nullptr)
{
}

एक सामान्य नियम के रूप में, आपको निर्माणकर्ता के उस संस्करण को पूरी तरह से निर्दिष्ट करना चाहिए जो तर्क की सबसे बड़ी संख्या लेता है, और फिर अन्य संस्करणों से प्रतिनिधि (प्रतिनिधि में तर्क के रूप में वांछित डिफ़ॉल्ट मानों का उपयोग करके)।


2
यह पहली बार में सहज ज्ञान युक्त लगता है, लेकिन वास्तव में वास्तव में मदद कर रहा है!
कोर्चकिडू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.