4

私は自分のクラスの多くのインスタンスを作成するプログラムを持っています。次に、それらを操作します。読み取り、変更、サードパーティのメソッドへの渡しなどです。

3つの質問があります。

  1. インスタンスのベクトルまたはポインターのベクトルを格納しますか? なんで?

  2. インスタンスを変更したくない場合、インスタンスまたはそれへのポインタを関数に渡しますか? なんで?

  3. インスタンスを変更したい場合、ポインターまたは参照を渡す必要がありますか? なんで?

前もって感謝します!

クラスの例:

class Player {
    public:
        static const char               width = 35;
        static const char               height = 5;
        static const char               speed = 15;

        int                             socketFD;
        float                           xMin;
        float                           xMax;

        char                            status;
        float                           x;
        float                           y;
        char                            direction;

                                        Player ( int );
        void                            Reset();
        void                            Move();
        void                            SetHost();
        void                            SetClient();

    private:
        void                            EscapeCheck();
};
4

6 に答える 6

6

インスタンスの配列とポインターの配列のどちらを保存しますか? なんで?

Classが基底クラスであり、オブジェクトのスライスを防止したい場合は、ポインターを格納します。そうでなければ、オブジェクト。

インスタンスを変更したくない場合は、インスタンスまたはそれへのポインタを関数に渡しますか? なんで?

値渡しの場合、コピーを操作しているため、元のオブジェクトは変更されません。ポインターまたは参照を渡す場合は、const としてマークします。

void foo ( MyClass const* );
void foo ( MyClass const& );

インスタンスを変更したい場合、ポインターまたは参照を渡す必要がありますか? なんで?

また。私は個人的に参照を好みます。ポインタは動的割り当てとより密接に関連しています。

最近では RAII がよく使用されるため、代わりにスマート ポインターを使用することをお勧めします。

于 2012-08-10T07:23:42.850 に答える
4

インスタンスの配列とポインターの配列のどちらを保存しますか? なんで?

これはユースケースに大きく依存します。コンテキストに応じて、どちらのソリューションでも問題ありません。ポリモーフィック型の基本クラスを格納したい場合や、要素のコピーを避けたい場合があります (たとえば、コピー不可能な型を扱う場合)。このような場合は、ポインターまたはスマート ポインターを格納する必要があります。

インスタンスを変更したくない場合は、インスタンスまたはそれへのポインタを関数に渡しますか? なんで?

次に、const 参照 (const インスタンスへの参照) を渡す必要があります。

void foo(const Foo& f);

インスタンスを変更したい場合、ポインターまたは参照を渡す必要がありますか? なんで?

次に、非 const 参照 (非 const インスタンスへの参照) を渡す必要があります。これは、既存のインスタンスを本当に変更したいことを前提としています。

void foo(Foo& f);

しかし、いつポインターを使用しますか? 次に、現在考えられる唯一のケースは、渡されたエンティティが無効または null 値を持つ可能性がある場合です。参照では、これは不可能であるか、少なくとも実装するのは簡単ではありません。0ポインターは、NULL(同じ) またはnullptrC++11に設定できます。

void (Foo* f) {
  if (f) {
    // do something with pointee
  } else {
    // deal with it
  }
}
于 2012-08-10T07:23:52.893 に答える
3

インスタンスの配列またはポインターの配列を格納しますか?なんで?

オブジェクトが大きい場合(つまり、2〜3を超えるプリミティブ型)、動的に割り当てられたインスタンスへのポインターの配列を格納する必要があります。これにより、オブジェクトの並べ替えとコンテナのサイズ変更/再割り当てがはるかに高速になります。ポリモーフィズムを利用している場合は、基本クラスへのポインター(参照もポリモーフィックであることに注意してください)を使用する必要があります。配列のすべての要素は同じサイズでなければならないため、これによりスライスが防止されます。したがって、複数のオブジェクトを格納する場合は、基本クラスへのポインターが最適です。

インスタンスをコンテナに格納することを好む場合は、単一のタイプ(継承とポリモーフィズムなし)があり、それほど大きくない(つまり、いくつかのプリミティブメンバータイプ)場合です。より大きなオブジェクトの場合、コストのかかる挿入と再割り当てを回避するために、配列の代わりにリンクリストを使用することをお勧めします。

インスタンスを変更したくない場合は、インスタンスまたはそのポインタを関数に渡しますか?なんで?

定数オブジェクトまたは定数参照へのポインタを渡します。プリミティブを渡す場合を除いて、安価なコピーを渡すだけで、元のオブジェクトの変更を回避できます。constオブジェクトへのポインターであるか、const参照であるかは、使用シナリオによって異なります。通常のインスタンスと同様に、参照の操作は簡単ですが、ポインターのように他のオブジェクトへの参照に変更することはできません。

インスタンスを変更したい場合、ポインタまたは参照を渡しますか?なんで?

インスタンスを変更する場合は、ポインタまたは参照のいずれかを渡します。2つのうちどちらか-上記を参照してください。このようにして、特定のインスタンスを直接変更できます。値を渡すこともできますが、一時的なコピーが1つ作成され、後で元のオブジェクトに割り当てる必要があります。それを行う意味はありません。変更が目的である場合は、常にポインタまたは参照を探してください。オブジェクトを変更するつもりがない場合でも、定数ポインターまたは参照を渡す方がはるかに安価です。これらはintのサイズであるのに対し、オブジェクトはかなり大きい可能性があるため、コピーしても意味がありません。プリミティブ型を渡す場合は、値を渡すこともできますが、オブジェクトを変更する場合は、回避可能な追加の割り当てが1つあります。

于 2012-08-10T08:02:02.310 に答える
3

2番目については、状況によって異なります。おそらく最も効率的なのは、代わりに定数参照を渡すことです。

そして一般的に、ポインターをできるだけ避けるようにしてください。ポインタを使用する必要がある場合は、スマート ポインタを使用してください。

于 2012-08-10T07:24:01.817 に答える
1

インスタンスの配列またはポインターの配列を格納しますか?なんで?

インスタンスの配列を使用することをお勧めします。メモリを管理する際の頭痛の種が少なくなります。ポインタの配列を動的に設定する場合、たとえば1000番目の要素でOOMをキャッチする可能性があります。これで、プログラムは半分の形式の配列をクリーンアップする必要があります。この意味で、一度に1つの大きなチャンクを事前に割り当てる方が適切です。

インスタンスを変更したくない場合は、インスタンスまたはそのポインタを関数に渡しますか?なんで?インスタンスを変更したい場合、ポインタまたは参照を渡しますか?なんで?

私は常に参照を好みます。そうすれば、その有効性のチェックをスキップできるからです。ウィキペディアによると、参照をNULLにすることはできませんが、動作が定義されておらず、コンパイラーではたまたまそのようになっているため、NULL参照をあちこちで蹴ることができます。しかし、あなたがそれを説明するならば、あなたは本当に権力の暗い側にいます。あるいは、ポインタを受け入れるように関数を宣言すると、通過するように誘われNULL、常にそれをチェックする必要があります。null参照を説明する素晴らしいブログがあります-私の心を変えた非常に良い例です。

参照を使用することの欠点の1つは、関数が引数を値で受け取るか参照で受け取るかをコードの関数呼び出し行から判断できないことです。

参照は本質的にポインタであり、参照型にはサイズがあることを覚えておく必要があります。したがって、Classが本当に小さい場合、関数内でオブジェクトを変更したくない場合は、値でオブジェクトを渡すことを検討してください。私はまだ参照を渡しClassますが、成長する可能性があり、その後、すべてのプロトタイプを修正しますが、良くありません。

于 2012-08-10T07:52:20.483 に答える
1
  1. ポインター自体と割り当てブロックヘッダーを節約できるため、インスタンスの配列の方が優れています。(配列がニーズに合っている場合)。

2,3 どちらの場合も、参照を渡す方が良いです。2番目のケースでは、const ref。利点は、ctor を呼び出さないことで節約できることです。

于 2012-08-10T07:23:05.153 に答える