है, मैं प्रारंभिक विवरण का उपयोग करके सरणी ऑब्जेक्ट प्रारंभ करना चाहता हूं।ऐरे ऑब्जेक्ट्स प्रारंभिकरण जिसके वर्ग में कुछ 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
क्या मुझे पता है उत्सुक हूँ पीछा कर रहा है,
क्यों हम प्रतिलिपि निर्माता निजी के रूप में घोषित नहीं कर सकते?
उपयोगकर्ता द्वारा परिभाषित प्रतिलिपि निर्माता क्यों नहीं लगाया जाता है (मुझे उम्मीद है कि आउटपुट में "कॉपी सीटीओआर: xxxx" कहीं भी शामिल होना चाहिए था। लेकिन मुझे वह नहीं मिला। इसलिए मुझे समझ गया कि उपयोगकर्ता द्वारा परिभाषित प्रतिलिपि निर्माता लागू नहीं किया गया।)
वास्तव में, मैं वास्तव में यकीन नहीं है कि इसके बाद के संस्करण जीएनयू जीसीसी के लिए विशिष्ट है या इस सी ++ भाषा विनिर्देश ... यह अगर आप में से कुछ मुझे सही दे सकता है की सराहना की होगी है नहीं कर रहा हूँ उपरोक्त पर सूचक।
आप '-fno-elide-constructors' के साथ _test_ करना चाह सकते हैं। –
इसी प्रकार का मामला: [प्रति-प्रारंभिकता का अजीब व्यवहार, कॉपी-कन्स्ट्रक्टर को कॉल नहीं करता है!] (Http://stackoverflow.com/questions/6163040/strange-behavior-of-copy-initialization-doesnt-call- प्रतिलिपि बनाने वाला) – Nawaz