2012-03-21 8 views
0

私はオブジェクトを持ち、別のオブジェクトへのポインタを持ち、オブジェクトに変数にアクセスしたいという奇妙な問題に遭遇しました。私はコンストラクタでそれを行うことができますが、私が関数のときにはうまくいきません。コンストラクタ内ではC++変数にアクセスできますが、関数内ではアクセスできません

http://pastebin.com/2FHd7ak0

EDIT:
ブロックの変数 '状態は' 私はそれらをinitalized後に変更するようです。最初は0x3015a8を出力し、次に0x110000に変更します

Edit2:私はコンパイルする小さな例を作ったが、アクセス違反の戻りコードを与える。 Imは明らかにポインタで何か間違っていますが、私は何を見つけることができません...私はJavaから来ているので、その理由かもしれません。 Fooの任意の方法で

http://pastebin.com/uF8t8wx9

+4

AHHHH !!! [可変シャドーイング](http://en.wikipedia.org/wiki/Variable_shadowing)悪い!:) – Mysticial

+2

'Bar'の完全な定義の前に' bar-> var'にアクセスするので、このコードをどのようにコンパイルするのか分かりません。 'Foo'の前に' Bar'の定義を置くと、 'Foo'から' Bar'の入れ子になったクラスの前方宣言を取り除き、 'main'を追加して、コンパイルし、リンクして、期待される結果を生成します。 –

+0

また、あなたはC#に精通しています。 C++では、関数のパラメータとして 'new anything()'のようなものを避けることをお勧めします。 –

答えて

0

メンバ関数を定義するときに、Barは(のみ前方宣言)が定義されていません。したがって、Bar::varにアクセスすることは不正です。コンパイラがそれを離れさせるならば、それは単なる運であるが、これは義務ではない。

Fooの定義の前にBarの定義を移動しても問題ありません。

2

あなたのサンプルプログラムで多くの問題があります。bar->varFoo::Fooの定義において

  1. を、あなたはこの表現を持っています。プログラムのこの時点で、Barは不完全です。不完全な型へのポインタを間接参照することはできません。

  2. 類似の名前を持つ2種類の型を宣言します。最初は::Foo::Bar、それ以降は::Barです。私はあなたが彼らが同じタイプであることを意味すると思う。彼らはそうではありません。

  3. メインコードの断片には、new Foo(new Bar());の式があります。 FooにはBar*というコンストラクターがないため、これはコンパイルされません。 (それはFoo::Bar*を取るコンストラクタを持っているが、それは別の獣です。)


:あなたは今、いくつかの他のプログラムの断片を掲載しています。上記の問題のどれもこの他のプログラムには存在しません。


pastebin entryでは、 StateGame::blockArrayを決して初期化しません。あなたは stateGame::setBlockで逆参照します。この結果、未定義の動作が発生します。

+0

実際のプログラムを投稿したばかりなので、その問題の詳細については、その記事を参照してください。 – Gmfreaky

+0

@Gmfreaky - 敬意を表して、私は同意しなければなりません。あなたは実際のプログラムを投稿しませんでした。実際のプログラムの* part *を投稿しました。あなたのサンプルプログラムを、エロルを示す最小限のプログラムに減らし、** short **、** complete **プログラム全体を投稿してください。参照:http://sscce.org/。 –

+0

さて、私はここにその事を要約しました:http://pastebin.com/2FHd7ak0まだ何かがないか、あまりにも大きければ、教えてください。 – Gmfreaky

0

StateGameBlock::Blockコンストラクタに渡します。ほとんどの場合、Blockを構築した後でStateGameオブジェクトを破壊することがほぼ確実です(おそらくStateGameがスタックに存在するか、delete)。

+0

StateGameが私のgameloopに存在し続けているので、そうは思わないです。私は決してそれに削除を呼び出すことはありません。 – Gmfreaky

関連する問題