2015-10-29 18 views
2

假設我有這個簡化類:如何使用union const成員?

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。我知道如果在聯合定義中刪除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*)'

順便說一句,我使用的DMD v2.068.2

+0

你確定這是你的常量的使用是正確的?什麼是const? – Kozzi11

回答

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; 
} 

那麼編譯器實現他們都是一個領域,只要求初始化一次。

我認爲這可以說是你的代碼不能正常工作的錯誤......貌似編譯器將匿名聯合和結構相同的方式,當再因爲一個變量覆蓋上所有的工會應該是不同的。

但是,簡單地設置兩個變通辦法使這就是我想現在就做。編輯:其實,我想我更喜歡命名的聯合選項。然後,稍後閱讀代碼時他們在一起會更加明顯。

+0

你認爲我應該提交一個bug嗎?如果是這樣,反對什麼? DMD? –

+0

編譯仍然失敗。查看問題中的更新... –

+1

你留下了一條線:注意我的事情,在工會下面還有一個「A a;」。當你使用一個命名的聯合,就像一個命名的結構,你還需要聲明一個該類型的變量來訪問它。注意我在設置時也使用了一個小寫的'a'。 –

1

我覺得你的代碼是沒有意義的。我想你的const的用法是錯誤的。

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

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

或者你coud只是刪除聯盟:

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

    private: 
    const char* result;   
} 

因爲const char** result無法改變反正。

+0

對於永遠不會在構造函數外部更改的成員,允許外部級別const。 'const char *'和'const(char)*'之間的區別在於後者可以重新分配給不同的字符串,而前者根本不能重新分配。 –

+0

是的,我知道,所以如果你只有一個構造函數來設置其中一個,那麼使用兩個const變量的聯合是沒有意義的,所以你永遠無法設置另一個構造函數 – Kozzi11

+0

它有時候是有意義的閱讀與兩種類型相同的東西。我假設在我們沒有看到的真實代碼中有更多的上下文。 –