2014-09-29 104 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