Çeşitli farklı türlerdeki verileri depolamak için bir birleşim kullanan özel bir varyant türü uygulamaya çalışıyorum. type_id
alanında, birleşikte kayıtlı olan veriyi depolamayı planlıyorum. Birlik önemsiz üyeler içerir. Çağrı MyVariant arasında örtük silinmiş varsayılan yapıcı için: şu hata mesajını alıyorumÖnemsiz üyelerle birliği içeren kurucu için oluşturucu ve kopya yapıcı
MyVariant v;
:
struct MyVariant {
enum { t_invalid, t_string, t_int, t_double, t_ptr, t_dictionary } type_id;
union {
int as_int;
double as_double;
std::string as_string;
std::unique_ptr<int> as_ptr;
std::map<int, double> as_dictionary;
};
};
Ben MyVariant
gibi bir örneğini oluşturmaya çalışırken aşağıdaki gibidir: İşte benim şimdiki uygulamasıdır. Yani, el yapıcı uygulamak gibi çalıştı aşağıdaki gibidir: silinen bir işlevi kullanmak Girişimi: Bana benzer hata mesajı verir
MyVariant() : type_id{t_int}, as_int{0} {}
.
MyVariant(int value) : type_id{t_int}, as_int{value} {}
ve aşağıdaki gibi benim örneğini oluşturmak: Sonra, ben aşağıdaki kurucu uygulamaya çalışmıştır
MyVariant v{123};
=> aynı hata iletisi: silinen bir işlevi kullanmak çalışıldı.
Ayrıca bir kopya oluşturucu uygulamaya başladım, aşağıdaki gibi görünüyor. Ancak, elbette bu derleyici hataları ile yardımcı olmaz.
MyVariant::MyVariant(const MyVariant& other)
{
type_id = other.type_id;
switch (type_id) {
case t_invalid:
break;
case t_string:
new (&as_string) std::string();
as_string = other.as_string;
break;
case t_int:
as_int = other.as_int;
break;
case t_double:
as_double = other.as_double;
break;
case t_ptr:
new (&as_ptr) std::unique_ptr<int>(nullptr);
as_ptr = std::make_unique<int>(*other.as_ptr);
break;
case t_dictionary:
new (&as_dictionary) std::map<int, double>();
// TODO: copy values from other
break;
}
}
Xcode ve Apple LLVM 6.1'i derleyici olarak kullanıyorum.
Ana soru şu: Neden aldığım derleyici hatalarını alıyorum ve derlemeyi yapmak için kodumu nasıl değiştirmem gerekiyor?
Ek soru şudur: Yapımcı ve kopya oluşturucu için uygulamam ile doğru yolda mıyım?
Bu varsayılan kurucu tamam. Bir yıkıcıyı uygulaman gerekiyor. –
Bir örneğinizin tahsis edildiği parens yerine parantez kullanmak mı istiyorsunuz? – donjuedo
@donjuedo Evet, diş tellerini kullanmak istedim çünkü üniform C++ 11 başlatma sözdizimine sadık kalmak istiyorum. Onlarda yanlış bir şey var mı? – j00hi