2017-09-26 9 views
0

私はクラスPixelとクラスImageを持っていて、ピクセル行を更新する機能を持っています。私はピクセルラインを初期化したい。私の問題は、配列を初期化することです。実は私はこのている:私はこれをしようとすると配列へのポインタ - 要素の初期化

bool UpdateLine(Pixel line[], int nb) 
{ 
    bool noError = true; 
    line = new Pixel[nb]; 
    for (int r = 0; r < nb; r++) 
    { 
     line[r] = new Pixel(); // -> line causing troubles 

     // do some stuff with my pixel 
     [...] 
    } 
    return noError; 
} 

私が持っている:

生存可能なオーバーロードされた '='

どのように私は私のアレイの各要素を初期化することはできませんか?

+3

'line'はオブジェクトの配列です!それらはすべて既に構築されています。 C++はC#またはJavaとは異なる働きをします。 [よい本または2つは必要だと思います。](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – StoryTeller

答えて

4

実際には、と2つのの問題があります。

new Pixel()は、ポインタからPixelオブジェクトになるため、最初のエラーとなります。 C++では、オブジェクトを作成するのにnewは必要ありません(おそらく、JavaやC#の背景から来ていますか?)。配列の初期割り当てによって、オブジェクトが作成されます。

第二の問題は、あなたがポインタ変数lineに割り当てることですが、lineは、関数内のローカル変数です。関数へのすべての変更は、関数が返ったら失われ、メモリリークが発生します。あなたはlineを参照番号で渡す必要があります。将来的には


データの単一種類のコレクションを扱うとき、私はあなたの代わりにstd::vectorを使用することをお勧め。しかし、要素を追加したい場合は、参照によってベクトルを渡す必要があります。

+0

また、最新のC++の美しさとパワーを楽しんで、ベクトル値を返すだけです – StoryTeller

+0

私のコードはC#から自動的に生成されていますが、私はまだC++にはあまり慣れていません。私は配列の代わりにベクトルを使用します。あなたの答えをありがとう。 –

+0

'bool UpdateLine(std :: vector * line、int nb)'の方が良いでしょうか? –

2
line[r] = new Pixel(); // -> line causing troubles 

line[r]は、ポインタではなくPixelオブジェクトであるため、ポインタを割り当てることはできません。

std :: vectorを使用していないのはなぜですか?

+0

代わりにベクターを使用しますC#で自動的に配列が生成されましたが、C++で配列のサイズを動的に変更しようとしているときに、ほとんどの場合、 –

+0

@ A.Pissicatの代わりにstd :: vectorを使用する必要があります。関数内のベクトルを作成し、値で返します。空の関数を関数に渡す必要はありません。 – xaxxon

関連する問題