我希望能够添加两个QList对象。例如:
QList<int> b;
b.append(10);
b.append(20);
b.append(30);
QList<int> c;
c.append(1);
c.append(2);
c.append(3);
QList<int> d;
d = b + c;
出于这个原因,我决定继承QList并重载operator +。
这是我的代码:
class List : public QList<int>
{
public:
List() : QList<int>() {}
// Add QList + QList
friend List operator+(const List& a1, const List& a2);
};
List operator+(const List& a1, const List& a2)
{
List myList;
myList.append(a1[0] + a2[0]);
myList.append(a1[1] + a2[1]);
myList.append(a1[2] + a2[2]);
return myList;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
List b;
b.append(10);
b.append(20);
b.append(30);
List c;
c.append(1);
c.append(2);
c.append(3);
List d;
d = b + c;
List::iterator i;
for(i = d.begin(); i != d.end(); ++i)
qDebug() << *i;
return a.exec();
}
,结果是正确的,但我不确定这是否是一个好方法。我想问一下是否有更好的解决方案?
答案 0 :(得分:0)
我建议不要重载+
运算符,因为QList
已经使用此运算符将两个列表连接在一起。考虑创建一个具有不同名称的成员函数来完成您要执行的操作。
修改强> 正如另一个答案所提到的,将此功能放在数据结构的派生类上有点不寻常,尽管从数据结构派生的本身不好。
在这种情况下,适合任何大小的列表的非成员非朋友函数可能是更合适的方法:
QList<int> addListValuesTogether(const QList<int>& a1, const QList<int>& a2)
{
QList<int> resultingList;
Q_ASSERT(a1.size() == a2.size());
for (int i=0; i<a1.size(); i++)
{
resultingList.append(a1[i] + a2[i]);
}
return resultingList;
}
您可以更进一步,使上述函数具有通用性(例如,如果您希望包含double
值的列表具有相同的功能)。
答案 1 :(得分:0)
这是一种奇怪的方法。更好地使用具有明确名称的单独功能。您正在为QList重新定义operator +的已建立语义,并且子类化容器也不是真正好的设计。 查看代码,您可能希望使用不会将列表与数学向量语义混合的自定义3D矢量类。
除此之外,您的运营商+实施中存在两个问题: