Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 子类化QList和运算符+;超载_C++_Qt - Fatal编程技术网

C++ 子类化QList和运算符+;超载

C++ 子类化QList和运算符+;超载,c++,qt,C++,Qt,我希望能够添加两个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; qlistb; b、 追加(10); b、 追加(20); b、 追加(30); qlistc; c、 追加(1); c、 追加(2); c、 追加

我希望能够添加两个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;
qlistb;
b、 追加(10);
b、 追加(20);
b、 追加(30);
qlistc;
c、 追加(1);
c、 追加(2);
c、 追加(3);
QList d;
d=b+c;
出于这个原因,我决定对QList进行子类化,并重载操作符+

这是我的密码:

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();
}
类列表:公共QList
{
公众:
列表():QList(){}
//添加QList+QList
好友列表运算符+(常数列表和a1、常数列表和a2);
};
列表运算符+(常数列表和a1、常数列表和a2)
{
列出我的清单;
myList.append(a1[0]+a2[0]);
myList.append(a1[1]+a2[1]);
myList.append(a1[2]+a2[2]);
返回myList;
}
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
名单b;
b、 追加(10);
b、 追加(20);
b、 追加(30);
名单c;
c、 追加(1);
c、 追加(2);
c、 追加(3);
名单d;
d=b+c;
列表::迭代器i;
for(i=d.begin();i!=d.end();+i)

qdGug())p>我不建议重载<代码> +>代码>运算符,因为QList已经使用这个运算符将两个列表串联在一起。考虑创建一个具有不同名称的成员函数来完成您要做的事情。< /P> 编辑 正如另一个答案所提到的,将此功能放在数据结构的派生类上有点不寻常,尽管从数据结构派生本身并不坏

在这种情况下,容纳任意大小列表的非成员、非友元函数可能是更合适的方法:

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;
}
QList addListValuesTogether(常量QList&a1、常量QList&a2)
{
QList结果列表;
Q_断言(a1.size()=a2.size());

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

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

  • 如果列表a1/a2中的元素少于三个(关键的、未定义的行为/崩溃),则不会处理这种情况,并且会忽略索引2之外的任何内容
  • 另外,当您指定给myList时,它仍然为空,因此myList[0]等无效。 您需要首先调整myList.resize(3)的大小,或者使用append()/push_back()而不是运算符[]

谢谢您的回复。好的,我将创建一个成员函数,但我仍然担心这种方法是否足够好,我的意思是:列出myList;myList.append(a1[0]+a2[0]);myList.append(a1[1]+a2[1]);myList.append(a1[2]+a2[2]);返回myList;感谢您的回复。myList.resize(3)是的,我忘了做那件事。