我有一个名为OrderedList的模板类,它采用原始数据类型并将其排序为从最小到最大的列表。我试图重载加法运算符,以允许两个列表合并到一个OrderedList。我希望该方法返回一个新的OrderedList对象,但我收到一个错误 这是我的OrderedList +运算符方法的代码。我还没有测试过这种方法的逻辑,所以我假设有一些错误。我目前正在尝试让+运算符合并数组并返回一个新对象
template<class mytype>
OrderedList<mytype>& OrderedList<mytype>::operator+ (const OrderedList<mytype>& a)
{
int size = a.size() + count;
int i=0, j=0, k=0;
OrderedList<mytype> *newList = new OrderedList<mytype>(size);
while (i < a.size() && j < count) {
if (a[i] <= list[j]) {
newList[k] = a[i];
i++;
} else {
newList[k] = list[j];
j++;
}
k++;
if (i < a.size()) {
for (int p = i; p < a.size(); p++) {
newList[k] = a[p];
k++;
}
} else {
for (int p = j; p < count; p++) {
newList[k] = list[p];
k++;
}
}
}
return newList;
}
答案 0 :(得分:1)
正如@ConnorHollis已在评论中指出,您正在OrderedList
- 运算符中分配新的+
实例。除了由于不同的类型和危险而无法工作,因为返回引用通常表示调用者不需要关心所有权,这也是非常意外的。 +
- 运算符应始终返回一个新对象,即构造的返回副本。
答案 1 :(得分:1)
您的方法定义如下所示。
OrderedList<mytype>& OrderedList<mytype>::operator+ (const OrderedList<mytype>& a)
但是,plus运算符通常会返回类类型的新实例,因此它应该是:
OrderedList<mytype> OrderedList<mytype>::operator+ (const OrderedList<mytype>& a)
没有参考,你可以看到。
现在你有一个指向新OrderedList的指针,但你不需要分配它!您可以创建它的实例并通过复制构造函数或赋值运算符返回它。所以我会将新的列表实例化更改为:
OrderedList<mytype> newList(size);
然后它可能会编译。
我决定让你做一个简单的演示! http://ideone.com/bFiv1W
希望能更好地解释它。