在C ++中为结构实现索引器

时间:2019-07-10 06:54:31

标签: c++ qt qt5

我在c ++ / qt中具有以下三角形结构,并且我想为其实现一个索引器,以便我可以按索引访问任何顶点,有人可以帮助我解决这个问题吗?

这是结构:

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

3 个答案:

答案 0 :(得分:2)

如果您确实需要它,可以将运算符[]这样添加到您的类中:

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

您可以使用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>;

答案 2 :(得分:0)

听起来您已经习惯了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");
     }
}

这在C#意义上声明了“ get”和“ set”,您可以在赋值的任何一侧使用它,具有通常的含义。例如

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