2011-03-11 7 views
7

Aşağıdaki gibi bir sınıf ve verilen birleşim verildiğinde, sendika bir doğru değeri nasıl başlatır?Sınıf başlatıcısında birleşim nasıl ayarlanır?

Burada denenmekte olan şey, sınıf için temel veri türlerinden biri olarak iki veya daha fazla farklı tür kullanmaktır. Void * kullanmak yerine, türlerin önceden bilinmesi halinde, kullanılacak tiplerin birliği inşa edilir. Sorun, sınıf başlatıldığında doğru sendika üyesini nasıl başlatacağınızdır. Tipler polimorfik değildir, bu nedenle normal kalıtım modeli uygun görünmemiştir. Doğru sendika üyesini başlatmak için bazı naif girişimler hiçbir yere yol açmadı.

union Union { 
    int n; 
    char *sz; 
}; 

class Class { 
    public: 
    Class(int n): d(1.0), u(n) {} 
    Class(char *sz): d(2.0), u(sz) {} 
    .... 
    double d; 
    Union u; 
}; 

çözüm için Temizleme sonra bir cevap belli oldu ve muhtemelen cevapları bu depo için iyi bir çözüm olabilir, bu yüzden aşağıya ekleyin.

cevap

9

Bir kurucuya sahip olmayan herhangi bir tür için, onu bir birleşim içinde başlatabileceğiniz ortaya çıkar. Bu answer on union initializers çözüm için bir ipucu verir: beklendiği gibi

union Union { 
    int n; 
    char *sz; 
    Union(int n): n(n) {} 
    Union(char *sz): sz(sz) {} 
}; 

Şimdi çalışır. Açıkçası, ne aradığını biliyorsan.

Düzenleme: Ayrıca, sınıf yapıcınızdaki bir tür kullanılmakta olan türü, genellikle int veya benzerleriyle de not edebilirsiniz.