Sto provando ad usare un sindacato (C++) che ha alcune variabili non primitive, ma sono bloccato cercando di creare il distruttore per quella classe. Come ho letto, non è possibile indovinare quale variabile del sindacato viene utilizzata, quindi non esiste un distruttore implicito e, poiché sto usando questa unione sullo stack, il compilatore commette errori che il distruttore viene cancellato. L'unione è la seguente:Come scrivere distruttore per classe union-like
struct LuaVariant {
LuaVariant() : type(VARIANT_NONE) { }
LuaVariantType_t type;
union {
std::string text;
Position pos;
uint32_t number;
};
};
La variabile type
stive che campo dell'unione viene utilizzato (a scelta tra un enum), ai fini della lettura da parte dell'Unione e potrebbe essere usato per indovinare il valore quello che dovrebbe essere cancellato Ho provato alcuni approcci diversi ma nessuno di loro ha funzionato. Prima di tutto, ho appena provato il distruttore predefinito:
~LuaVariant() = default;
Non ha funzionato, poiché l'impostazione predefinita è ... cancellata. Così, ho provato scambiando il valore con uno vuoto, in modo che i contenuti sarebbero stati cancellati e non ci sarebbe nessun problema "perde" un valore vuoto:
~LuaVariant() {
switch (type) {
case VARIANT_POSITION:
case VARIANT_TARGETPOSITION: {
Position p;
std::swap(p, pos);
break;
}
case VARIANT_STRING: {
std::string s;
std::swap(s, text);
break;
}
default:
number = 0;
break;
}
};
Ma come io non sono un maestro dei sindacati, Non so se questo può causare altri problemi, come la memoria allocata che non viene mai deallocata, o qualcosa del genere. Questa strategia di swap può essere utilizzata senza difetti e problemi?
Invece di vostro trucco di swap, è necessario chiamare in modo esplicito distruttore. Il tuo codice non invoca i distruttori per l'oggetto nell'unione. Questo è probabilmente solo una perdita di risorse piuttosto che UB, ma la soluzione più pulita e corretta è chiamare i distruttori. –
* classe union-like * è il termine standard per un 'union', o una classe/struct che contiene un'unione anonima. –