Наличие проблем с" Союзом " вынуждает инициировать всех членов, а не только активного.
Привет!
У меня есть следующий код (с некоторыми ненужными деталями, удаленными):
Заголовок:
enum class TargetType : uint8 { NoTarget , Location , Actor }; class Target { public: Target(); Target(const FVector &inLocation); Target(const AActor *inTargetActor); // ... some methods here private: TargetType targetType; union { FVector location; TWeakObjectPtr<AActor> targetActor; }; };
Источник:
// ... header includes Target::Target() : targetType { TargetType::NoTarget } { } Target::Target(const FVector &inLocation) : targetType { TargetType::Location } , location(inLocation) { } Target::Target(const AActor *inTargetActor) : targetType { TargetType::Actor } , targetActor(inTargetActor) { } // ... some code
Когда я пытаюсь скомпилировать это, я получаю следующие ошибки:
error C4582: 'Target::location': constructor is not implicitly called error C4582: 'Target::targetActor': constructor is not implicitly called error C4582: 'Target::targetActor': constructor is not implicitly called error C4582: 'Target::location': constructor is not implicitly called
Составитель жалуется на то, что члены Союза не инициируются. Первый конструктор жалуется на то, что оба члена не инициируются. Два других жалуются на то, что член не инициируется, поэтому, например, если я хочу использовать местоположение, компилятор хочет, чтобы я также инициировал targetActor.
Мой вопрос заключается в том, действительно ли я должен инициировать оба члена, если я не собираюсь использовать их, например, в первом конструкторе? Для меня это не имеет никакого смысла, так как я не хочу использовать данные в этом случае? Кроме того, почему я должен инициировать
Target::locationкогда я хочу использовать
Target::targetActorкак активный член? Я что-то здесь упускаю?
Заранее спасибо!
Что я уже пробовал:
Я уверен, что кто-то лучше меня понимает, что происходит!
Спасибо за любую помощь!
Примечание: Я использую C++11, но существовал только тег C++14?