2011-05-30 15 views
8

है, मैं प्रारंभिक विवरण का उपयोग करके सरणी ऑब्जेक्ट प्रारंभ करना चाहता हूं।ऐरे ऑब्जेक्ट्स प्रारंभिकरण जिसके वर्ग में कुछ ctor/dtor

TestClass array[5] = { 
    TestClass("test1"), 
    TestClass("test2"), 
    TestClass("test3"), 
    TestClass("test4"), 
    TestClass("test5") 
}; 

सी ++ के लिए एआरएम (एनोटेट संदर्भ मैनुअल) जैसे कुछ आधिकारिक पुस्तक के अनुसार, ऐसा लगता है यह कहना है कि इस तरह से वस्तु सरणी जो निर्माता/नाशक है प्रारंभ करने में है। इसके बाद, मैंने अभी निम्नलिखित नमूना कोड बनाया है और देखें कि क्या होता है।

#include <iostream> 
#include <sstream> 
#include <string> 

class TestClass 
{ 
public: 

    TestClass(const char* name) : name_(name) 
    { 
     std::cout << "Ctor(const char*) : " << name_ << std::endl; 
    } 

    ~TestClass() 
    { 
     std::cout << "Dtor() : " << name_ << std::endl; 
    } 

    TestClass() : name_("") 
    { 
    } 

    void print() 
    { 
     std::cout << "obj:" << name_ << std::endl; 
    } 
private: 
    TestClass(const TestClass& rhs); 

    std::string name_; 
}; 

int main() 
{ 
    TestClass array[5] = { 
     TestClass("test1"), 
     TestClass("test2"), 
     TestClass("test3"), 
     TestClass("test4"), 
     TestClass("test5") 
    }; 

    for (unsigned int i = 0; i < sizeof(array)/sizeof(array[0]); ++i) { 
     array[i].print(); 
    } 

    return EXIT_SUCCESS; 
} 

पहले परीक्षण जीएनयू जीसीसी का उपयोग करके उपरोक्त स्रोत कोड (4.1.2) को संकलित करने के लिए, यह निम्नलिखित की तरह कुछ उत्पन्न करके असफल रहा।

error: ‘TestClass::TestClass(const TestClass&)’ is private 

तो मुझे समझ में आया कि इसका मतलब है कि ऑब्जेक्ट सरणी प्रारंभ करने की अनुमति देने के लिए, इसे 'कॉपी कन्स्ट्रक्टर' की आवश्यकता होगी। फिर मैंने उपर्युक्त कोड को उपयोगकर्ता द्वारा परिभाषित (सार्वजनिक) प्रतिलिपि निर्माता को निम्नानुसार संकलित करने का प्रयास किया।

TestClass::TestClass(const TestClass& rhs) : name_(rhs.name_) 
{ 
    std::cout << "Copy Ctor : " << name_ << std::endl; 
} 

मैं सफलतापूर्वक स्रोत कोड संकलित कर सकता हूं। हालांकि, जब मैं उपरोक्त बनाया गया प्रोग्राम निष्पादित करता हूं, तो मुझे निम्न आउटपुट मिला।

Ctor(const char*) : test1 
Ctor(const char*) : test2 
Ctor(const char*) : test3 
Ctor(const char*) : test4 
Ctor(const char*) : test5 
obj:test1 
obj:test2 
obj:test3 
obj:test4 
obj:test5 
Dtor() : test5 
Dtor() : test4 
Dtor() : test3 
Dtor() : test2 
Dtor() : test1 

क्या मुझे पता है उत्सुक हूँ पीछा कर रहा है,

  1. क्यों हम प्रतिलिपि निर्माता निजी के रूप में घोषित नहीं कर सकते?

  2. उपयोगकर्ता द्वारा परिभाषित प्रतिलिपि निर्माता क्यों नहीं लगाया जाता है (मुझे उम्मीद है कि आउटपुट में "कॉपी सीटीओआर: xxxx" कहीं भी शामिल होना चाहिए था। लेकिन मुझे वह नहीं मिला। इसलिए मुझे समझ गया कि उपयोगकर्ता द्वारा परिभाषित प्रतिलिपि निर्माता लागू नहीं किया गया।)

वास्तव में, मैं वास्तव में यकीन नहीं है कि इसके बाद के संस्करण जीएनयू जीसीसी के लिए विशिष्ट है या इस सी ++ भाषा विनिर्देश ... यह अगर आप में से कुछ मुझे सही दे सकता है की सराहना की होगी है नहीं कर रहा हूँ उपरोक्त पर सूचक।

+2

आप '-fno-elide-constructors' के साथ _test_ करना चाह सकते हैं। –

+0

इसी प्रकार का मामला: [प्रति-प्रारंभिकता का अजीब व्यवहार, कॉपी-कन्स्ट्रक्टर को कॉल नहीं करता है!] (Http://stackoverflow.com/questions/6163040/strange-behavior-of-copy-initialization-doesnt-call- प्रतिलिपि बनाने वाला) – Nawaz

उत्तर

3

चाहे संकलक द्वारा कॉपी कन्स्ट्रक्टर का उपयोग न किया जाए, यह सुलभ होना चाहिए - यानी यह निजी नहीं होना चाहिए। इस मामले में, कंपाइलर कॉन्स char * कन्स्ट्रक्टर का उपयोग करके कॉपी कन्स्ट्रक्टर का उपयोग करने से बच सकता है, लेकिन इसे अभी भी एक सुलभ प्रतिलिपि ctor की आवश्यकता है। यह ऐसी चीज है जो एआरएम में शामिल नहीं है, जो कि पुरानी है।

+0

आपके स्पष्ट उत्तर के लिए धन्यवाद। अब मैं स्पष्ट रूप से संबंधित हो सकता हूं। – Smg

4

कंपाइलर प्रतिलिपि को कॉपी करता है, लेकिन कॉपी-कन्स्ट्रक्टर को अभी भी पहुंच योग्य होना चाहिए।

+0

आपके स्पष्ट उत्तर के लिए धन्यवाद। विधिवत समझा। – Smg

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

  • कोई संबंधित समस्या नहीं^_^