C++ 子类化QList和运算符+;超载
我希望能够添加两个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<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)是的,我忘了做那件事。