Реализация индексатора для структуры в C ++ - PullRequest
1 голос
/ 10 июля 2019

У меня есть следующая структура треугольника в c ++ / qt, и я хочу реализовать для нее индексатор, чтобы я мог получить доступ к любой из вершин по индексу, кто-нибудь может мне помочь с проблемой?

Вотструктура:

struct Triangle
{
    QVector3D *a;
    QVector3D *b;
    QVector3D *c;
}

Ответы [ 3 ]

2 голосов
/ 10 июля 2019

Если вам это действительно нужно, вы можете добавить оператор [] в ваш класс следующим образом:

struct Triangle
{
QVector3D *a;
QVector3D *b;
QVector3D *c;
QVector3D * operator[](int n) {return n==0?a:n==1?b:n==2?c:Q_NULLPTR;}
};

Triangle tr; 
//.....
auto test = tr[0]; //will return vector 'a'
1 голос
/ 10 июля 2019

Вы можете использовать std::array

struct Triangle {
    std::array<QVector3D *, 3> points;
    QVector3D * operator[](int n) {return points[i];}
};

Triangle tr; 
auto test = tr[0];        //will return first component (former 'a')\

Поскольку точки в struct Triangle являются общедоступными, перегрузка оператора не требуется.

auto test = tr.points[0]; //will return first component (former 'a')

Если вы не собираетесь добавлять дополнительные функции в struct Triangle, рассмотрите возможность использования

using Triangle = std::array<QVector3D *, 3>;
0 голосов
/ 10 июля 2019

Похоже, вы привыкли к C #, где для создания нужных вам объектов new.В C ++ нет.

struct Triangle
{
    QVector3D a;
    QVector3D b;
    QVector3D c;
    QVector3D& operator[](int);
}

QVector3D& Triangle::operator[](int which)
{
     switch(which)
     {
          case 0: return a;
          case 1: return b;
          case 2: return c;
          default: throw std::out_of_range("Must be 0-2");
     }
}

Это объявляет "get" и "set" в смысле C #, вы можете использовать его с любой стороны присваивания в обычном смысле.Например,

Triangle t;
auto point = t[1];
t[2] = { 1, 2, 3 };
...