0

我希望能够添加两个 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();
}

,结果是正确的,但我不确定这是否是一个好方法。请问有没有更好的解决办法?

4

2 回答 2

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值的列表具有相同的功能)。

于 2012-11-21T16:57:23.093 回答
0

这是一种奇怪的方法。最好使用具有明确名称的单独函数。您正在为 QList 重新定义 operator+ 的既定语义,并且子类化容器也不是很好的设计。查看您的代码,您可能希望使用不将列表与数学矢量语义混合的自定义 3D 矢量类。

除此之外,您的 operator+ 实现中还有两个问题:

  • 您没有处理列表 a1/a2 的元素少于三个(关键的、未定义的行为/崩溃)的情况,并且您忽略了索引 2 之外的任何内容。
  • 此外,当您分配给 myList 时,它仍然是空的,因此 myList[0] 等无效。您需要先 myList.resize(3),或者使用 append()/push_back() 而不是 operator[]。
于 2012-11-21T17:03:26.880 回答