使用模板在C ++中重载运算符

时间:2012-09-02 22:11:33

标签: c++ templates casting operators overloading

我在C ++中遇到运算符重载问题。

我定义了以下类:

template <class T>
class Array
{
public:
//! Default constructor
Array(int ArraySize = 10);

////! Defualt destructor
Array<T>::~Array();

//! Redefinition of the subscript operator
T& Array<T>::operator[] (int index);

//! Redefinition of the assignment operator
const Array<T>& Array<T>::operator=(const Array<T>&);

//! Redefinition of the unary operator -
Array<T>& operator-(Array<T>& a);

//! Array length
int size;

private:
//! Array pointer
T *ptr;
};

一元运算符 - 定义如下:

//! Redefinition of the unary operator -
template<class T> 
 Array<T>& operator-(Array<T>& a){
    static Array<T> myNewArray(a.size);

    for( int i = 0; i < a.size; i++){
    myNewArray[i]=-a[i];    
    }
    return myNewArray;
}

如何避免“myNewArray”内存的持久性? Whitout“静态”声明 当函数结束时,myNewArray消失,并且没有像VectorA = -VectorB那样的任何赋值。

第二个问题是关于铸造操作员的过载;我用这种方式重载了铸造操作员:

//!CASTING
template <class B>
operator Array<B>(){
    static Array<B> myNewArray(size);

.... a function makes the conversion and returns myNewArray populated...

return myNewArray;
}

但它不起作用!在使用静态声明执行函数之后,对象myNewArray似乎消失了。任何赋值如VectorA =(Array&lt;'anytype'&gt;)VectorB都会失败。

错误在哪里?请问每个人都建议一个解决方案吗? 提前谢谢!

3 个答案:

答案 0 :(得分:1)

对于您的运营商,请勿返回参考。返回myNewArray的副本。大多数编译器都可以忽略副本并使用返回值优化来使性能可以接受。

您还应将这些方法标记为const,因为它们不会更改状态。

template<class T> 
 Array<T> operator-(const Array<T>& a) {
    Array<T> myNewArray(a.size);

    for( int i = 0; i < a.size; i++){
    myNewArray[i]=-a[i];    
    }
    return myNewArray;
}

答案 1 :(得分:0)

  

没有“静态”声明myNewArray在函数时消失   结束并失败,如VectorA = -VectorB。

不,它没有。编译器确保它挂起的时间足够长,以便复制。

此外,如果您将myNewArray初始化为原始副本,代码将更清晰:

Array<T> myNewArray(a);
for (int i = 0; i < myNewArray.size(); ++i)
    myNewArray[i] *= -1;

答案 2 :(得分:-1)

嗯,既然这两个问题都涉及到正确分配新值的神秘失败,那么赋值运算符是否有问题?