3

だから、私はオブジェクトへのポインタのベクトルを格納するクラスを持っています。ベクトルにオブジェクトを追加するメソッドがあります。追加するとき、私は参照またはポインターで渡すことができることを知っており、それぞれの長所と短所について読んだことがありますが、この場合、どちらが優れているのか、そしてその理由を理解できません。私が理解できるすべてのことについて、それらはほとんど同じです(しかし、私はおそらく間違っています!)

ポインタ/アドレスを渡す(の言い換え)は次のとおりです。

hpp:
class Room {
    vector<Item*> items;
public:
    void addItem(Item*);
};

cpp:
void Room :: addItem(Item* item) {
    items.push_back(item);
}

...そして参照で渡す:

hpp:
class Room {
    vector<Item*> items;
public:
    void addItem(Item &);
};

cpp:
void Room :: addItem(Item &item) {
    items.push_back(&item);
}

どちらを使うべきですか?

4

4 に答える 4

5

少しでも問題ではないので、呼び出しサイトでより自然に見えること、またはコードの他の部分とより一貫性のあることを行います。

OK、それぞれに有利な点はわかりますが、あなたの場合にそれらが重要かどうかはわかりません。

  • ポインタを渡すと、引数の使用方法がより正確に反映されます(ただし、それが有用なセマンティック情報なのか実装の詳細なのかはわかりません)
    • ポインタ(またはnew直接の結果)を渡す呼び出しサイトは自然に見えます
    • 自動変数のアドレスを渡すような愚かなことをしているコールサイトは目立ちます
  • 参照で渡すことは、引数NULLが正しくないことを示唆しています。これは正しくて有用である場合とそうでない場合があります。
于 2012-07-11T23:03:51.287 に答える
1

Technically, both are equivalent ways of passing and will work equally well. However, at design level, there are differences regarding how these interfaces may be interpreted by user, what contract is promised. It's also matter of self-descripting interfaces.

At first glance, the by-pointer version says: item may be pointer to an existing object or it may be nullptr (likely, addItem does test the pointer and reacts), whereas the by-reference version indicates, the item must refer to an existing object (caller must guarantee that, so addItem does not have to test it).

Simply, chosing the syntax is also a matter of expressing your intentions clearly and unambiguously.

于 2012-07-11T23:11:58.450 に答える
1

どちらでも、プログラムの残りの部分のコンテキストに応じて。

どちらも正常に機能するので、どちらがコードをより明確にするかという問題があります。

于 2012-07-11T23:00:52.367 に答える
0

これは、参照がポインターよりも何らかの利点を提供する場合、またはその逆の場合ではないため、構文の(あなたの)好みの問題です。クライアントコード(ルームタイプを使用)を読んでいる人に、値ではなく参照によってアイテムを渡していることがすぐにわかるように、ポインターを使用することをお勧めします。

于 2012-07-11T23:03:43.733 に答える