2013-05-03 38 views
3

我遇到了一個名爲PolyBoolean的庫。這與我的問題基本無關。 在庫有一個奇怪的結構類型如下:一個奇怪的C++結構的引用成員

struct VNODE2 
{ 
    VNODE2 * next; 
    VNODE2 * prev; 
    UINT32 Flags; 
    union 
    { 
     VECT2 p; 
     GRID2 g; 
    }; 
}; 

和GRID2的定義爲:

struct GRID2 
{ 
    INT32 x, y; 
}; 

GRID2定義的一個點,VECT2類似於GRID2和點的另一個表示VNODE2node。假設我有一個VNODE2結構變量v2,我如何獲得gxy的值?

我試過v2.g.x,vs2008編譯器給了我一個錯誤:"error C2059: syntax error"任何幫助將不勝感激。

+1

抱歉發佈的代碼的結構不良。我是新來的,不知道如何格式化它,因爲它在編輯器中。 – liudaisuda 2013-05-03 14:48:51

+0

這就是爲什麼具有足夠高聲譽的用戶可以編輯其他人的帖子。 :) – 2013-05-03 14:50:43

+0

非常感謝。這看起來不錯 – liudaisuda 2013-05-03 14:51:53

回答

1

這是匿名聯合,所以你提到的成員,就像它們,請參閱: enter image description here

確保您在結構之前聲明GRID2。這是一個工作示例。您也可以命名您的工會在您的班級中創建實例。

typedef int UINT32; 
typedef int VECT2; 
typedef int INT32; 

struct GRID2 
{ 
    INT32 x, y; 
}; 

struct VNODE2 
{ 
    VNODE2 * next; 
    VNODE2 * prev; 
    UINT32 Flags; 
    union 
    { 
     VECT2 p; 
     GRID2 g; 
    }; 
}; 

int main(int argc, char** argv) { 

    VNODE2 v; 
    v.g.x=1; 
    return 0; 
} 

中,如果你想你的工會有名字的情況下做到這一點,如下所示:

struct GRID2 
{ 
    INT32 x, y; 
}; 

struct VNODE2 
{ 
    VNODE2 * next; 
    VNODE2 * prev; 
    UINT32 Flags; 
    union 
    { 
     VECT2 p; 
     GRID2 g; 
    }myNamedUnion; 
}; 

int main(int argc, char** argv) { 

    VNODE2 v; 
    v.myNamedUnion.g.x=1; 
    return 0; 
} 
+0

非常感謝。有效。 – liudaisuda 2013-05-03 17:17:56

+0

很好,87654321 – 4pie0 2013-05-03 18:14:50

0

v2.p和v2.g應該可以工作。

struct VNODE2 
{ 
    VNODE2 * next; 
    VNODE2 * prev; 
    union 
    { 
    int p; 
    float g; 
    }; 
}; 

int main() 
{ 
    VNODE2 bla; 
    bla.p = 17; 
    std::cout << bla.p << std::endl; 
    bla.g = 18; 
    std::cout << bla.g << std::endl; 
} 

輸出:

17

18

+0

1.問題是關於訪問'p'和'g'的成員。 2.我不喜歡調用UB並說它「有效」(設置'g',然後讀取'p')。 – BoBTFish 2013-05-03 14:59:34

+0

哦,我以爲他只是想訪問工會的項目。還好,這是UB!如果你以不同的方式使用聯合,它總是UB,或者可以寫bla.p然後輸出它嗎? – Sarien 2013-05-03 15:02:20

+0

@Sarien如果您設置聯合的一個成員,然後再閱讀另一個聯合成員,那麼它就是UB,除非它們都是共享前綴的標準佈局結構,並且只能訪問該前綴。 – Angew 2013-05-03 15:06:49