2011-05-30 18 views
8

olan dizi nesneleri başlatma Aşağıdaki gibi başlatma ifadesini kullanarak dizi nesnelerini başlatma işlemini gerçekleştirmek istiyorum.Sınıfının bazı ctor/dtor değeri

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

C++ için ARM (açıklamalı referans manuel) gibi bazı güvenilir kitabın göre, bu yapıcı/yıkıcı sahip nesne diziyi başlatmak için bir yol olduğunu söylüyor gibi görünüyor. Bunu takiben, aşağıdaki örnek kodu oluşturdum ve ne olduğunu görün. GNU GCC kullanarak, yukarıdaki kaynak kod (4.1.2) hazırlanması için, ilk deneme için de

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

, aşağıdaki gibi bir üreterek başarısız oldu.

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

Yani bu nesne dizisi başlatma izin vermek için, bu kopya kurucu 'gerektirecektir anlamına geldiğini anladı. Daha sonra, yukarıdaki kodu kullanıcı tanımlı (ortak) kopya oluşturucuyu aşağıdaki gibi tanıtarak derlemeye çalıştım. Kaynak kodunu başarıyla derleyebilirim. Ancak, yukarıdaki yapıyı kurduğumda aşağıdaki çıktıyı elde ettim. Ben şu merak edilir olduğum şey

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 

,

biz özel olarak beyan kopya kurucu yapamaz Neden
  1. ?

  2. Kullanıcı tanımlı kopya kurucusu neden çağrılmıyor (Çıktının "Kopya Kopyalama: xxxx") içermesi bekleniyordu, ancak bunu alamadım. Bu nedenle, kullanıcı tanımlı kopya kurucusunun anladığını anladım. müracaat edilmemiştir.) Aslında

, yukarıdaki GNU GCC özeldir veya bazılarınız bana doğru verebilir bu C++ dilinin özellikleri ... sevindirici olabilir olup olmadığını gerçekten emin değilim Yukarıdaki işaretçi.

+2

_test_ '-fno elide-constructors 'ile çalışmak isteyebilirsiniz. –

+0

Benzer durum burada: [Kopya-başlatmanın garip davranışı, kopya yapıcıyı çağırmıyor!] (Http://stackoverflow.com/questions/6163040/strange-behavior-of-copy-initialization-doesnt-call- the-copy-constructor) – Nawaz

cevap

3

Bu durumda, derleyici, const char * yapıcısını doğrudan kullanarak kopya oluşturucuyu kullanmaktan sakınabilirdi, ancak yine de erişilebilir bir kopyaya ihtiyacı vardır. Bu, ARM'de kapsanmayan, türden bir şey.

+0

Açık cevabınız için teşekkür ederiz. Şimdi açık bir şekilde ilişki kurabiliyorum. – Smg

4

Derleyici kopyayı seçer, ancak kopya yapıcı hala erişilebilir olmalıdır. Kopya kurucusu, derleyici tarafından kullanılmasın, erişilebilir olması gerekir - yani özel olmamalıdır.

+0

Açık cevabınız için teşekkür ederiz. Tamamen anlaşıldı. – Smg

İlgili konular