0

C++ を使用してゲームを開発しています。私は多くの場所で、C++ でポインターを使用することは基本的に絶対に避けるべきであると読んだことがあります。私はまだC++を学んでおり、これに少し混乱しています。

永続的で、ゲーム セッションの間存続するプレーヤー オブジェクトが必要です。このオブジェクトには、プレーヤーのインベントリ、プレーヤーの統計などが含まれます。

プレーヤーのインベントリは基本的に、アイテム オブジェクト (私が作成した「アイテム」クラス) を含む単なるベクトルです。

誰かが次のことを明確にできれば、私の混乱は解消されます。

  1. 人々が「ポインターは悪い」と言うとき、それは標準の C++ ポインターを意味しますか? スマートポインタは「OK」と見なされますか?
  2. ポインター以外に、ヒープに割り当てられた永続オブジェクトにアクセスするにはどうすればよいでしょうか?
  3. プレーヤーのインベントリでアイテムを見つけるメソッドが必要ですが、アイテムが見つからない場合は NULL を返す場合、ポインタなしでどのように実装できますか? 「findItem」から返されたアイテムは編集可能である必要があるため (たとえば、アイテム数を変更するため)、現時点ではベクター内のアイテムへのポインターを返します。これはポインターの有効な使用法ですか?

どんな助けでも大歓迎です!

4

2 に答える 2

1
  1. はい、の C スタイルのポインターは悪いと見なされます。スマートポインターは問題ありません。(スマート) ポインターを使用する必要がある状況があります。たとえば、ポリモーフィック オブジェクトのコレクションですstd::vector<std::unique_ptr<IObject> >

  2. 永続オブジェクトはヒープ上にある必要はありません。それは、静的な保存期間を持つオブジェクトでも、十分な長さの自動オブジェクトでもかまいません。つまり、 で作成しますmain()

  3. さまざまな方法 - 例外をスローする (おそらく厳しすぎる) かstd、イテレータを返す方法を実行できます - に似てい.end()ます。

于 2012-10-10T11:32:15.610 に答える
1

個人的には、(boost または std から) 共有ポインターを使用することをお勧めします。生のポインターを使用しないでください。C++ には auto_ptr のような他のスマート ポインターもありますが、現在それらを使用している人はほとんどいません。ヒープに何かを割り当てたい場合は、次のようにします。

std::shared_ptr<ClassA> A(new ClassA());

これは、生のポインターを使用するよりも安全です。スコープ外に出ると、共有ポインターは、それが指しているオブジェクトが破棄されることを保証します。生のポインターはこれを行っていません。つまり、手動ですべてを破棄する必要があります。

于 2012-10-10T11:54:44.240 に答える