2010-12-08 16 views
1

大量のベクトルを使用するクラスがあります。ベクトルの反復子は互換性がありません

class Bar { 
    Bar(); 
    std::vector<Foo> * _grid; 
    void someFunction(); 
} 

Bar::Bar() { 
    _grid = (std::vector<Foo> *)malloc(_gridSize * sizeof(std::vector<Foo>); 
    memset(_grid, 0, _gridSize * sizeof(std::vector<Foo>); 
} 

void Bar::someFunction() { 
    int index = 0; 
    std::vector<Foo> someVariable = _grid[index]; 
} 

はしかし、すぐに私はsomeFunction()呼び出すように、私はすぐに_grid[index]で一部のコンテンツがあるようvector iterators incompatibleエラーメッセージが表示されます。ベクトルが空の場合、それは機能します。

無効なイテレータによって生成されたエラーメッセージについては読んだことがありますが、この時点では何も変更されていないため、ここでは間違っていません。

+3

なぜあなたは 'malloc'を使っていますか?あなたのベクターは構築されていません! –

+0

これについての奇妙なことは、push_backなどが働いていて、ビジュアルスタジオが容量とサイズで正しく表示されていることです^^。コンストラクタを忘れてしまった。 – Etan

+0

"私は大量のベクトルを使いたいクラスをいくつか持っています。"実行時に明らかにあなたが決定している金額。うーん...なぜベクトルのベクトルを使うのではないの?あなたは何とか、それらの使用の途中で**どんなベクトルが**あるのか何とか忘れましたか? :) –

答えて

4

ほとんどの場合、ベクトルを動的に割り当てる必要はありません。ちょうどクラスのメンバーとして含まれます:あなたは本当にダイナミックにベクトルを割り当てたい場合は

class Bar { 
    std::vector<Foo> _grid; 
}; 

は、あなたがベクトルを構築newを、使用したいです。今書かれているように、ベクトルのスペースはmallocで、ベクトルが占めるすべてのバイトをゼロに設定します。割り当てられたオブジェクトにはstd::vectorコンストラクタを呼び出さないので、std::vectorとして使用することはできません。

a good introductory C++ bookの言語を習得していることを確認してください。 C++メモリモデルとオブジェクトモデルを理解できない場合は、正しいC++コードを書くことができるようになります。

+0

まあ、私はしたい:-)グリッドへのインデックスは時間の経過とともに変化してはならないので。 – Etan

+0

あなたのヒントは "新しい"を取って私の問題を解決するのを助けました。ありがとう。 – Etan

+0

@エタン:あなたのコメントは意味をなさない。ベクトルのアドレスは、それがメンバーである「バー」のインスタンスが存在する限り変化しない。 –

関連する問題