我在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都会失败。
错误在哪里?请问每个人都建议一个解决方案吗? 提前谢谢!
答案 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)
嗯,既然这两个问题都涉及到正确分配新值的神秘失败,那么赋值运算符是否有问题?