2016-11-08 5 views
0

私はC++に慣れようとしています。 ディメンションを知らずにファイルから行を読み込むたびに、動的配列にオブジェクトを追加します。 Rlmrは、IDなどの公共の文字列を持つクラスですオンザフライオブジェクトの初期化C++

Rlmr *myArray; 

は、私はこのような配列へのポインタを宣言しました。

は今、私はラインでファイルの行を読んで、その後私は、コンパイラからのエラーを理解していません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」と呼ばれている
new (myArray + index - 1) Rlmr(cBeacId); 

(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`オブジェクトになります。それがエラーを起こす理由です。

問題を解決する1つの方法は、std::vector(常にデフォルトのコンテナに移動する)を使用することです。次に、あなたが本当に標準C++ストリームの施設や文字列クラスを使用する方法を学ぶ必要があることに加えて

std::vector<Rlmr> myArray; 

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

ような何かを行うことができます。長期的には、C++プログラマーとしてのあなたの人生は、特に創造的な方法でstandard algorithm functionsのいくつかを使い始めることができれば、ずっと簡単になります。