0

これはスタイルの問題と見なされるかもしれません。別のクラスのインスタンスへの参照を保持するクラスがあります。

class A { };

class B {
  A& ref;

public:
  explicit B(A& ref) : A(ref) { }
};

ref が null ポインターになることはあり得ないため、ポインターの代わりに参照を使用することにしました。また、コードの見栄えも良くなります。

しかし、ユーザーは私が A をコピーしたかどうかわかりませんよね?この場合、コピーはしないので、B のインスタンスがまだ存在しているときに A が破棄されると、問題が発生します。ポインターを使用すると、もちろん同じことが起こりますが、ユーザーはコードを書いているときに、コピーが行われていないことに気付いていると思います。

これについての意見は?この問題に対処する最善の C++ の方法は何でしょうか?

PS .: 私が考えた 1 つの解決策は、ポインターが保持されるようにすることですが、ポインターが指すオブジェクトが破棄された場合は、最初にコピーが作成されます。これを実装するのはそれほど難しくありませんが、要点は次のとおりです。余分なトラブルはそれだけの価値があり、オーバーヘッドはそれを正当化するでしょうか? この種の自作の参照カウンターは、人々が実際に行うものですか?

4

4 に答える 4

3

Bの単一のインスタンスのみを使用する必要があり、そのインスタンスが変更されない場合A、参照は理にかなっています。したがって、Bのインスタンスなしでは構築できませんA- 密結合を導入します。

ただし、 のインスタンスをB独立して持つことができる場合はA、それをポインタにします。これにより、A後で必要に応じて のインスタンスを設定できます。Aいずれにせよ、 ;の寿命を保証する必要があります。これを回避する唯一の方法 (ライフ タイム コントロール) は、スマート ポインターを使用して のライフ タイムを管理することですA

于 2013-05-21T10:03:25.133 に答える
0

これは私の個人的なルールです。保持されない関数パラメーターの参照、保持されるものへのポインターです。次に、ユーザーがポインターを通過する場合、ユーザーは寿命を詳しく調べる必要があります。また、B をコピーしたい場合はどうなりますか? 参照の場合は、これ以上変更できません。

于 2013-05-21T10:09:31.027 に答える
0

一般的に言えば、ポインターと参照の両方でまったく同じです...

Bで参照されているオブジェクトAを削除することが可能であると言っているため、A参照オブジェクトを持たないBオブジェクトを持つことは有効です。参照ではこれを行うことはできません。ヌルポインターが必要です->参照ではなくポインターを使用してください

于 2013-05-21T09:58:53.673 に答える