我在c ++ / qt中具有以下三角形结构,并且我想为其实现一个索引器,以便我可以按索引访问任何顶点,有人可以帮助我解决这个问题吗?
这是结构:
struct Triangle
{
QVector3D *a;
QVector3D *b;
QVector3D *c;
}
答案 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 };