使用重载的运算符+返回带有不可访问地址的指针

时间:2014-01-24 15:19:14

标签: c++

我已经找到了很多关于这个错误的讨论,但到目前为止我没有尝试过任何工作。

基本上我正在使用动态数组创建一个模板矢量类,但是当我尝试重载“+”运算符时,它只适用于2个加数(v3 = v1 + v2),当我尝试3个加数时(v4 = v1 + v2 + v3),它返回最后一个加数(v3)。我发现这是因为当第二次调用重载+运算符的函数时,第一个加数的指针值为0xcccccccc。这意味着它可能会对不再存在的东西产生兴趣。但是,我不知道如何从重载函数返回向量对象。这是我尝试过的,但这些都不起作用:

//this works only for two addends
template <class T> Vector<T>& operator+(Vector<T>& v1, Vector<T>& v2)
{
    Vector<T> v;
    //calculations
    return v;
};

//this causes above mentioned error
template <class T> Vector<T> operator+(Vector<T>& v1, Vector<T>& v2)
{
    Vector<T> v;
    //calculations
    return v;
};

//this causes above mentioned error too
template <class T> Vector<T> operator+(Vector<T>& v1, Vector<T>& v2)
{
    Vector<T>* v= new Vector<T>;
    //calculations
    return (*v);
};

任何想法如何返回矢量对象,以便它也适用于3个加数?

1 个答案:

答案 0 :(得分:9)

您需要使用const引用,以便它们可以绑定到临时对象:

template <class T> 
Vector<T> operator+(const Vector<T>& v1, const Vector<T>& v2)
{
  Vector<T> tmp = v1;
  tmp += v2;
  return tmp;
}

如果您的类型可以有效移动,您可以使用右值参考oveloads来利用它:

template <class T> 
Vector<T> operator+(Vector<T>&& v1, Vector<T>&& v2)
{
  Vector<T> tmp = std::move(v1);
  tmp += v2;
  return tmp;
}

显然,您不应该返回引用或需要被调用者删除的内容。