如何使用union const成员?

时间:2015-10-29 13:24:22

标签: d

假设我有这个简化的类:

class A {
    this(const char* result)
    {
        this.result = result;
    }

    private:
        union{
            const char** results;
            const char* result;
        }
}

编译因constructor app.A.this missing initializer for const field results而失败。我知道如果我在union定义中删除const限定符,我可以编译它,但我知道成员是const。

编辑:

当我将代码更改为:

class A {
    this(const char* result)
    {
        this.U.result = result;
    }

    private:
        union U {
            const char** results;
            const char* result;
        }
}

我收到另一个错误:Error: need 'this' for 'result' of type 'const(char*)'

BTW,我使用的是dmd v2.068.2

2 个答案:

答案 0 :(得分:2)

最简单的就是初始化它:

    this.results = null;
    this.result = result;

请务必先设置您不使用的那些,因为您不想用null覆盖联合!

您也可以将其命名为联盟:

    union A{
        const char** results;
        const char* result;
    }

    A a;

this(const char* result)
{
    this.a.result = result;
}

然后编译器意识到它们都是一个字段,只要求初始化一次。

我认为这可能是一个错误,你的代码不起作用......看起来编译器以同样的方式处理匿名联合和结构,然后联合应该是不同的,因为一个变量覆盖了它们。 / p>

但是简单地设置两者的工作原理使得我现在的工作方式如此。编辑:实际上,我认为我更喜欢命名的联合选项。然后更明显的是,他们在稍后阅读代码时会在一起。

答案 1 :(得分:1)

我认为你的代码没有意义。我猜你对const的使用是错误的。

class A {
    this(const(char)* result)
    {
        this.result = result;
    }

    private:
    union
    {
        const(const(char)*)* results; // maybe const(char)** results
        const(char)* result;
    }
}

或者你可以删除union:

class A {
    this(const char* result)
    {
        this.result = result;
    }

    private:
    const char* result;        
}

因为const char** result无论如何都无法改变。