Как получить доступ к анонимному члену union / struct в C ++? - PullRequest
4 голосов
/ 05 февраля 2011

Этот вопрос - моя ошибка . Код, описанный ниже, создается без проблем.


У меня есть этот класс.

vector.h

struct  Vector
{
    union
    {
        float   elements[4];
        struct
        {
            float   x;
            float   y;
            float   z;
            float   w;
        };                  
    };

    float   length();
}

Vector.cpp

float Vector::length()
{
  return x;  // error: 'x' was not declared in this scope
}

Как получить доступ к элементу x, y, z, w?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2011

Вам нужен экземпляр вашей структуры внутри анонимного объединения.Я не знаю точно, что вы хотите достичь, но, например, что-то вроде этого будет работать:

struct Vector
{
  union
  {
    float elements[4];
    struct
    {
      float x, y, z, w;
    }aMember;
  };

  float length() const
  {
    return aMember.x;
  }
};
4 голосов
/ 05 февраля 2011

То, что вы создали, это не анонимный участник, а анонимный тип (который сам по себе бесполезен).Вы должны создать члена вашего анонимного типа.Это касается как вашей структуры, так и вашего объединения.

Настройте заголовок так:

struct  Vector
{
    union
    {
        float   elements[4];
        struct
        {
            float   x;
            float   y;
            float   z;
            float   w;
        } v;
    } u;

    float   length();
};

Теперь вы можете получить доступ к своим членам следующим образом:

u.elements[0] = 0.5f;
if(u.v.x == 0.5f) // this will pass
    doStuff();
...