質問
私のSDLプログラムでは、私は特定のクラス内のオブジェクトの「無限」の配列をシミュレートするために、マップ構成物を使用しています。コードは、罰金をコンパイルするために管理し、私は、すぐにマップを使用して機能の一つは、トリガーがあるとして、プログラムを実行すると、プログラムがクラッシュし、3の値を返します。
だから、ここで私がやっているまさにです。
class MyClass
{
public:
int MyFunction();
protected:
std::map< int, MyObject > MyMap;
}
int MyClass::MyFunction()
{
...
int i;
if( MyMap.empty() )
{
i = 1;
}
else
{
i = MyMap.size() + 1;
}
MyMap[ i ] = PreviouslyDefinedObject;
return i;
}
MyFunctionを()がMyClassのオブジェクトから呼び出されると、クラッシュが発生します。使用のものがマイマップを使って行われたときに発生するようです:あなたが最後から二番目の行をコメントアウトし、ちょうど私を返すようにしようとした場合にクラッシュし、あなたはちょうど私が= 1に設定した場合、それがクラッシュして、マイマップにオブジェクトを割り当てる[i]の
私はそれらを右使用しているかどうか分からないので、これは、私が今までのマップを使用したのは初めてです。これは、基本的な間違いのどこかにありますか?右方向に誰ポイント私はできますか?乾杯ます。
解決
たぶん、あなたはこのように、初期化されていないポインタから関数を呼び出しています。
MyClass *obj;
obj->MyFunction();
他のヒント
マップが値を持つキーを関連付けるために使用されています。あなたは、配列を探しているなら、あなたはA vector
して使用する必要があります。マップが配列でないので、マップよりも「無限の配列」をシミュレートするのより良い仕事を行います。
は、通常、ベクトルを持つ要素のの多くの割り当てることができます。あなたが本当に大きな配列をシミュレートしようとしている場合、私はベクトルのベクトルを包むお勧めします。いくつかの数学では、あなたはそれのためにoperator[]
を作成することができ、その正しい配列へのインデックス、正しい要素へ。
としてあなたのコードのために、実際にそれがクラッシュしなければならない理由を判断するのに十分な情報がない、あなたは私たちがコンパイルするかを見てのための最小限のプログラムを作成しようとする必要があると思います。