在C ++中添加向量

时间:2014-09-29 20:29:44

标签: c++ vector operator-keyword addition

我是一名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。

2 个答案:

答案 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;