我是一名C ++初学者,我正在尝试编写一个方法,它将采用两个向量并将它们的内容相加。
例如, v1 {1,2,3} + v2 {2,4,6}应该产生v3 {3,6,9}。
以下是我的代码现在的样子:
Vec Vec::operator+(const Vec& original){
if(mySize != original.mySize){
throw invalid_argument ("No!");
}
Item* sumVector = new Item(mySize);
for(unsigned i=0; i<mySize; i++){
sumVector[i] = myArray[i] + original.myArray[i];
}
return * sumVector;
}
但是,这不起作用,因为我的断言v3.getItem(0)== 3失败了。如果你回答这个问题,我相信你已经知道了,但Vec是我的一个类的名字,而Item是一个typedef double。
答案 0 :(得分:2)
正如评论中提到的juanchopanza,sumVector
是一个指针。不幸的是,operator[]
是为指针定义的,这可能给初学者带来了令人困惑的编译错误。
对于最能保留原始代码错误意图的解决方案,请执行以下操作:
sumVector[i] = myArray[i] + original.myArray[i];
需要这样:
(*sumVector)[i] = myArray[i] + original.myArray[i];
这样,您首先取消引用指针,然后访问矢量类operator[]
。这真的很糟糕,甚至可能都不是解决方案。
您必须了解您的代码正在做什么。您正在堆上分配一个新的Items
数组,然后使用Vec
返回*Item
的副本,这相当于{{1} },作为Item[0]
的构造函数。你不仅构造函数是一个带有单个双输入的Vec
(没有看到你的类声明我不知道这是否是有效的,但它可能不是),但这个堆分配Vec
永远不会有相应的自由,因为当你离开函数范围时,你已经失去了对它的唯一引用。你永远无法释放内存,这意味着内存泄漏。
正确的意图(我假设)是使用计算在堆栈上创建一个局部向量,然后返回它。这意味着改变两行:
Items
到
Item* sumVector = new Item(mySize)
return * sumVector;
请注意,除了一些元数据之外,矢量类型通常只在其类类型中包含指针。该指针值在堆栈上分配,指针本身指向向量管理的堆内存。
答案 1 :(得分:-2)
更改此声明
Item* sumVector = new Item(mySize);
到
Item* sumVector = new Item[mySize];
而不是
return * sumVector;
应该有
return sumVector;
前提是类Vec有一个参数类型为Item *
的构造函数
但是在任何情况下构造函数都存在问题,因为即使它具有类型Item *
的参数,它也不知道分配了多少元素。
因此,您必须在运算符的主体内创建一个Vec类型的对象。
最好将运营商声明为
Vec Vec::operator+(const Vec& original) const;