2016-11-08 78 views
0

我想習慣C++。 我想在每次從文件中讀取一行而不知道維時,在動態數組中添加一個對象。在飛行對象初始化C++

我宣佈這樣一個指針數組:

Rlmr *myArray; 

其中Rlmr是與公共字符串作爲ID的一類。

現在我通過線讀取文件中的行之後,我想一個對象添加到myArray的

​​

我不明白,然後從編譯器錯誤:

error: no match for âoperator=â in â*(myArray+ ((unsigned int)(((unsigned int)index) * 28u))) = (operator new(28u), (<statement>, ((Rlmr*)<anonymous>)))â

什麼是錯的。而且,如何使用std :: vector來完成。 我想了解這兩種方式,謝謝。

+7

有幾件事情是錯誤的。 'malloc'。 'malloc'是C,而不是C++。 C++代碼使用'new'。此外,你甚至不應該使用'malloc'或'new',但是你應該使用'std :: vector',讓它擔心自動調整數組的大小。如果你想「習慣C++」,最好的方法是學習如何正確使用C++容器。現代C++代碼很少需要動態分配任何內存。如果你想使用'std :: vector',你的C++書會給出一個更好的解釋,而不是簡單的回答stackoverflow.com –

+0

...特別是如果這本書來自一個好的C++書籍列表](http://stackoverflow.com/q/388242/1782465) – Angew

回答

1

出了什麼問題? new返回一個指針。在下面的行您要的指針分配給現有對象:

myArray[index-1] = new Rlmr(cBeacId); 

相反,你應該寫:

new (myArray + index - 1) Rlmr(cBeacId); 

被稱爲「放置new」(CF here)。這解決了你的問題,但不應該滿足任何人。

其次,如何與vector做到這一點:在vector

std::vector<Rlmr> data; 

while (fgets(buffer, MAXSIZEBUFFER, fp) != NULL) { 
    if(buffer[0] == '#') // Skip comment lines 
     continue; 
    else { 
     sscanf(...); 
    } 
    data.emplace_back(cBeacId); 
} 

詳細信息。 vector::emplace_back可用here

1

首先不要用malloc動態分配對象。相反,使用new(或new[]如果分配數組)。

現在爲您的問題。該數組是一個對象數組,而不是指向對象的指針數組。並且new Rlmr(cBeacId)產生*指針to a Rlmr對象。這就是爲什麼你會得到一個錯誤。

解決您的問題的一種方法是使用std::vector(它應該始終是「轉到」默認容器)。然後,你可以這樣做

std::vector<Rlmr> myArray; 

while (...) 
{ 
    ... 
    myArray.emplace_back(cBeacId); 
} 

除此之外你應該學習如何使用標準C++流設施和String類。從長遠來看,它將使您的C++程序員變得更加輕鬆,特別是當您可以創造性地使用某些standard algorithm functions時。