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

Implementing an indexer for a struct in c++

本文关键字:实现 索引 结构 c++      更新时间:2023-10-16

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

结构如下:

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

如果你真的需要它,你可以像这样在你的类中添加运算符 []:

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'

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

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