3

私のアプリケーションでは、外部ソースから取得した型情報に基づいて新しいオブジェクトを動的に作成する必要があります。基本的に、このタスクを処理するクラス A があります。クラスは、クラス B、C、または D などを作成します (B がベースで、C と D が派生型であるとします)。次に、このオブジェクトを、タイプ B の参照パラメーターを期待するメソッドでいっぱいの既存のインターフェイスに渡したいと思います。最終的に、この動的に割り当てられたオブジェクトは、別のクラスの boost::shared_ptr メンバー オブジェクトに格納されます (reset() を使用します)。メソッド)。その時点で、メモリは誰かによって管理されています。

基本的に、これは私には悪い設計のようです (この動的に割り当てられたオブジェクトをあちこちに渡し、ある時点で逆参照し、後で再びポインターを取得しています)。一方で、インターフェイスのいくつかのメソッドを、参照ではなくポインターを取るように変更したくありません。そのインターフェイスをそのままにして、さらに処理するためにオブジェクトをインターフェイスに渡すときにポインターを逆参照したいと思います。参照パラメーターを取るメソッドがある場合、「ここではメモリ管理について心配していません」と「このオブジェクトは初期化されます-つまり、NULLにすることはできません」と言っていることをどこかで読みました。ただし、オブジェクトは最初はヒープ上に作成され、最終的にはそのメモリを管理する別のクラスによって「所有」されます。

4

1 に答える 1

1

オブジェクトの使用法と有効期間に関する設計の主な目標は、オブジェクトの所有権が常に明確でよく理解されることであるべきだと思います。作成と削除は、理想的には 1 か所だけで処理するか、別の場所で作成してハンドオフするときに明確に指示されます。

私の好みは、オブジェクトが何らかのコードによって完全に所有されるまで、ポインターを使用することです。それが所有されると、所有者は参照としてそれを渡すことができます。

  • ポインターを使用すると、 「ここにオブジェクトがあります。誰かがそれを望んでいますか?」と解釈してもかまいません。
  • 参照を使用すると、 「ここに私のオブジェクトがあります-使用できます」と言っています

しかし、そのためにコードの残りの部分が見苦しく、紛らわしいものになるのであれば、その理想を維持することは、あなたが支払う代償に見合うものではありません。少なくとも作成とハンドオフをきれいに見せることができれば、コードの他の(十分に文書化された)部分に風変わりなものを隠すことができます...

B * myInst = A::BFactory( current_state_of_universe );
bool bSubmitted = SubmitForMagic( myInst );
if( !bSubmitted ) delete myInst;
于 2012-08-14T03:26:58.993 に答える