2014-09-29 88 views
-2

我是一名C++初学者,我正在尝试编写一个方法,它将采用两个向量并将它们的内容组合在一起。在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。

+3

'sumVector'是一个指针(它不需要,它不应该是这样。)想一下当运算符[]在应用于指针时的作用。 – juanchopanza 2014-09-29 20:31:15

+7

哦,没有内存泄漏操作员!你为什么按价值返回一个新对象? – Borgleader 2014-09-29 20:31:50

+4

嘿欢迎_ @ TheFaceOfBlue_!在开始推出自己的产品之前,使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)怎么样?有很多障碍和陷阱来完成它,并且几乎从不值得这样做,以获得专有的实现。 – 2014-09-29 20:35:46

回答

-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; 
+0

好吧,我这样做,它仍然无法正常工作。嗯...对此抱歉。我相信这是一个简单的解决方法,但正如我所说,我是一个初学者。 – TheFaceOfBoe 2014-09-29 20:40:56

+0

@TheFaceOfBoe查看我更新的帖子。 – 2014-09-29 20:43:35

+0

@TheFaceOfBoe我在文章中添加了关于构造函数的额外注释,您必须在操作符体内创建一个Vec类型的对象,因为我不知道构造函数将如何知道数组中有多少元素被分配。 – 2014-09-29 20:57:17

2

正如在评论中提到juanchopanza,sumVector是一个指针。不幸的是,operator[]是针对指针定义的,这可能会给初学者一个混乱的编译错误。

对于最好保留原始代码的错误意图的解决方案,这一点:

sumVector[i] = myArray[i] + original.myArray[i];

需求是这样的:

(*sumVector)[i] = myArray[i] + original.myArray[i];

这样,你去参考首先指针,然后访问矢量类的operator[]。这真的很糟糕,甚至可能不是解决方案。

您必须了解您的代码正在做什么。您正在上分配Items的新数组,然后使用*Item(相当于Item[0])作为Vec的构造函数返回Vec的副本。你不仅是构造函数Vec带有一个单一的双输入(没有看到你的类声明,我不知道这是否是一个有效的东西,但它可能不是),但这个堆分配Items永远不会有一个相应的免费因为当你离开函数作用域时,你失去了唯一的引用。你将永远无法释放内存,这意味着它是内存泄漏。

正确的意图(我假设)是在堆栈上计算创建一个本地向量,然后返回它。这意味着改变两行:

Item* sumVector = new Item(mySize) 
return * sumVector; 

Vec sumVector(mySize); //now this is actually a vector 
return sumVector; 

需要注意的是矢量类型通常只容纳一个指针在同类产品类型,除了一些元数据。该指针值分配在堆栈上,指针本身指向矢量管理的堆内存。

+0

好吧,我认为这是有道理的。我要说实话,所有这些指针和解引用的东西对我来说仍然有点棘手,因此我必须研究这些。 我做了你建议的编辑,但现在我认为我的类型不匹配,因为我得到了'sumVector [i] = myArray [数组下标'错误'invalid types'Item {aka double} [unsigned int]''我] + original.myArray [我];'我不认为是有道理的,因为所有这三个参数都是Item *,除了sumVector,我只是根据您的建议更改了它。 对不起。谢谢您的帮助! – TheFaceOfBoe 2014-09-29 23:01:00

+0

哎呀我打算把'Item'改成'Vec'!我假设你的向量有一个构造函数,它需要一个大小? – Suedocode 2014-09-29 23:14:31