2013-01-06 18 views
5

dayalı olarak başka yapıcı ben bu sınıfıC++ yapıcı çağrı parametresi türü

class XXX { 
    public: 
     XXX(struct yyy); 
     XXX(std::string); 
    private: 
     struct xxx data; 
}; 

(bir yapıyla çalışır) ilk kurucu sahip uygulanması kolaydır. İkincisi, belirli bir biçimde bir dizeyi ayrıştırabilir, ayrıştırmak ve aynı yapıyı ayıklayabilirim. Başka bir kurucusunu çağırmak için this(params) kullanma

XXX::XXX(std::string str) { 

    struct yyy data; 
    // do stuff with string and extract data 
    this(data); 
} 

:

Sorum java böyle bir şey yapabileceği vardır. Bu durumda benzer bir şey yapabilir miyim?

Teşekkürler

cevap

2

Evet. C++ 11'de bunu yapabilirsiniz. Bu constructor delegation denir.

struct A 
{ 
    A(int a) { /* code */ } 

    A() : A(100) //delegate to the other constructor 
    { 
    } 
}; 
+0

Şu anda bu değişikliği uygulayan hangi derleyiciler olduğunu biliyor musunuz, örneğin Clang'ın (henüz) olmadığını hatırlıyorum. –

+0

@MatthieuM .: Hiç bir fikrim yok. Herhangi bir derleyici ile test etmediniz. :-) – Nawaz

+0

:) Korkarım ki bu uygulamada önemli görülmüyordu çünkü özel bir yönteme yapılan temsil çoktan zaten iyi çalışıyor (tüm nitelikler atamayı desteklediği sürece) ve dolayısıyla herkes için düşük öncelikli. –

8

aradığınız terimi "constructor delegation" dir (veya daha genel olarak, "zincirleme kurucular"). C++ 11'den önce bunlar C++ 'da mevcut değildi. C++ 11, yapabileceğiniz en iyi tümüne ortak şeylerle uğraşmak özel yardım edicinin olduğu kullanmıyorsanız

class Foo { 
public: 
    Foo(int x) : Foo() { 
     /* Specific construction goes here */ 
    } 
    Foo(string x) : Foo() { 
     /* Specific construction goes here */ 
    } 
private: 
    Foo() { /* Common construction goes here */ } 
}; 

: Ama sözdizimi sadece bir temel sınıf yapıcısı çağırma gibidir Kurucular (bu başlatma listesine koymak istediğiniz şeyler için can sıkıcı olsa da). Örneğin:

class Foo { 
public: 
    Foo(int x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
    Foo(string x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
private: 
    void ctor_helper() { /* Common "construction" goes here */ } 
}; 
+0

Cevabınızı destekliyorum çünkü daha eksiksiz. Ama örnekler çok güzel olurdu. :-) – Omnifarious

+2

@Omnifarious: Örnekler şimdi mevcut! –