2012-04-05 132 views
2

为了方便,我正在编写一个通用的Array类和重载操作符。我已经得到了我的数组对象以保存其他数组对象,但我无法覆盖*运算符。我需要复制左侧的对象,所以我的操作*代码是这样的:C++模板复制构造函数深拷贝

Array<T>& operator*(const double scalar) { 
    return Array<T>(*this) *= scalar; 
} 

(符* =已超载和作品)。

我推翻如下拷贝构造函数:

更新:新的拷贝构造函数:

Array<T> (const Array<T>& copyfrom) { 
    size_=copyfrom.size(); 
    data=new T[size_]; 
    copy(&copyfrom.data[0], &copyfrom.data[size_], data); 
} 

我的想法是,如果阵列是不是通用的,但总是充满了一种原始的,该代码会工作。但我认为这里发生了一些事情,因为我使用的模板导致了我不期望的行为。新“深度复制”数组中的数据数组就像它只是“copyfrom”数据数组的浅指针副本。

如何使用模板使此复制构造函数对基元和对象都起作用?或者,更好的是,有没有办法重载运算符*而不必担心复制构造函数?谢谢。

编辑:这是operator*=的代码。但我仍然认为我的问题在于我使用复制构造函数。

Array<T>& operator*=(const double scalar) { 
    for (int i=0; i<size_; i++) 
     data[i]*=scalar; 
    return *this; 
} 

编辑:我意识到,我得到的问题,因为我忽略了我的内心阵列的size在我的数组的数组。事情现在更可靠。每个人都很有帮助,而且我认为我正在开展这项工作。我的operator=(我没有超载;很好,迈克尔)现在如下所示。它的行为如预期,但我开始在我的程序中出现malloc错误,我正在探索原因。这里的内存管理有什么问题吗?

Array<T>& operator=(const Array<T>& a) { 
    if (this==&a) 
     return *this; 
    delete [] data; 

    size_=a.size(); 
    data=new T(size_); 
    copy(&a.data[0], &a.data[a.size()], data); 

    return *this; 
} 

编辑:我修正了malloc错误!我的方法现在都按预期工作。内存问题来了,因为我有这种方法头:

template <typename T> 
static Array<T> matrixSolve (Array<Array<T> > m); 

我正在按值的数组。各种各样的问题。通过参考获取数组,一切都解决了。感谢大家的帮助!

+0

@MichaelAnderson'operator *'的代码不应该返回'this'。 'Array (* this)'的调用调用了我已经确认的拷贝构造函数。另外,如果我使用'operator *'const,那么当我使用'operator * ='时,我不会收到编译错误,所以我不能改变'this'。 – Enigmoid 2012-04-05 11:01:08

+0

你是对的 - 我会删除这些评论。 – 2012-04-05 12:21:28

+0

你能告诉我们'Array :: operator ='?当你使用'data [i] = copyfrom.data [i]'时,你正在为数据调用'operator ='。如果那没有定义你会得到默认的。所以,如果你嵌套阵列和阵列没有=然后坏事情会发生。 – 2012-04-05 12:25:35

回答

3

你会希望你的operator *成员函数看起来是这样的:如果你返回一个Array<T> &,那么你将被返回到临时将被摧毁了一个参考

Array<T> operator*(const double scalar) const { 
    Array<T> result(*this); 
    result *= scalar; 
    return result; 
} 

,导致未定义行为。

+0

你可能也想让'operator *'const也是。 – 2012-04-05 03:02:23

+0

@MichaelAnderson:真的 - 改变了 – 2012-04-05 03:52:35

+0

把这三条线合在一起没什么不好,就像OP的原始代码一样;事实上,我认为它更具可读性,因为您不会引入声明临时变量名称的噪音,并且它立即可见,您实际上正在执行“'* this * = scalar' with backup”。它只是通过引用返回以及缺少错误的const。 – leftaroundabout 2012-04-05 11:14:26