一个奇怪的C ++结构的引用成员

时间:2013-05-03 14:47:05

标签: c++ struct reference unions

我遇到了一个名为PolyBoolean的库。这基本上与我的问题无关。 在库中有一个奇怪的结构类型如下:

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,如何在x中获取yg的值?

我试过v2.g.x,vs2008编译器给了我一个错误:"error C2059: syntax error"任何帮助都会非常感激。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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