联盟强制启动所有成员,而不仅仅是活跃成员?

时间:2017-05-17 10:24:31

标签: c++ c++11 unions

我有以下代码(删除了一些不必要的细节):

部首:

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

编译器抱怨工会成员没有被启动。第一个构造函数抱怨两个成员都没有被启动。另外两个人抱怨该成员没有被发起,所以例如如果我想使用Target::location,编译器也希望我启动Target::targetActor

如果我不打算使用它们,我是否真的必须启动这两个成员,例如在第一个构造函数?对我来说没有意义,因为我不想在这种情况下使用数据?另外,当我想使用Target::location作为活跃会员时,为什么我必须启动Target::targetActor?我在这里错过了什么?

0 个答案:

没有答案