Назначение одной и той же памяти переменным-членам класса с помощью объединений - PullRequest
1 голос
/ 03 апреля 2011

Я пытаюсь векторизовать существующий класс Vector

class Vector
{
 public:
   float X,Y,Z;
};

Попытка векторизации членов класса, не затрагивая другие классы, обращающиеся к этой переменной-члену

class Vector
{
 public:
   union{
      float X,Y,Z;
      vector float vec4;
   };
};

Но есть ошибка компилятора, так как не найдено имя члена X, Y, Z. Есть ли альтернативный способ получить переменную?

Для справки, тип vector float происходит от IBM ™ Cell Broadband Engine ™ Software Development Kit V3.0 для многоядерного ускорения .

Ответы [ 4 ]

0 голосов
/ 15 ноября 2013

Это должно сработать.

#include <iostream>

using namespace std;

class Point
{
public:
    Point() { X = 0.0f; Y = 0.0f; Z = 0.0f; };
    ~Point() {};

    union
    {
        struct{
            float X; float Y; float Z;
        };
        float index[3];
    };

    float operator[](int it)
    {
        return index[it];
    };
};

void main()
{
    Point p;

    p.X = 1.0f;
    p.Y = 2.0f;
    p.Z = 3.0f;

    cout << p[0] << " " << p[1] << " " << p[2] << endl;

    p.index[0] = 4.0f;
    p.index[1] = 5.0f;
    p.index[2] = 6.0f;

    cout << p[0] << " " << p[1] << " " << p[2] << endl;

    cin.get();
}
0 голосов
/ 03 апреля 2011

Нет способа сделать это в стандартном C ++, используя union.Вы можете читать только то, что написали ранее.Поэтому запись X, Y, Z и чтение vec4 приводит к неопределенному поведению.

Я бы предложил создать функцию-член vector float toVector() const, которая будет создавать вектор при необходимости.Или вы можете рассмотреть определение члена operator vector float() const.

0 голосов
/ 28 августа 2011

Вы не можете делать в точности то, что вы хотите (используя синтаксис из вашего кода).

Один пример правильного способа сделать это:

union{
    float coords[4];
    vector float vec4;
};

И затем вы можете выбрать элемент за элементом.

В качестве альтернативы:

union{
    struct {
        float X, Y, Z;
    } v;
    vector float vec4;
};

Но затем вы получаете доступ к значениям через .v.X

0 голосов
/ 03 апреля 2011
struct VectorData {
  float X, Y, Z;
};

union VectorUnion {
  VectorData VecData;
  vector float vec4;
};


class Vector {
public:
  Vector() : X(u.VecData.X), Y(u.VecData.Y), Z(u.VecData.Z) {}
  float & X;
  float & Y;
  float & Z;
private:
  VectorUnion u;
};

Это самый близкий, я думаю, вы можете получить со стандартным C ++ - это делает Vector больше и требует, чтобы вы сами реализовали оператор присваивания.

...