1

QScriptEngineclass のオーバーロードされたクラス コンストラクターを介して渡しているへのポインターがあり、EvaluatorそれをQScriptEngine *engine_(クラスPropertyサブクラスEvaluator、および のこのコンストラクターを呼び出しEvaluatorて、既に割り当てられている に渡しますQScriptEngine) に割り当てます。引数のないコンストラクターは、新しいQScriptEngineポインターを作成します (この方法でクラスのGenericサブクラスEvaluatorを作成します)。デストラクタで、そうengine_でないかどうかをテストNULLし、ポインタを削除してから割り当てますNULLengine_派生のポインター ( )Propertyも にする必要がありますNULLか? そうではないことを何かが教えてくれます。そうでない場合、この状況にどのように対処しますか? QScriptEngine全体を通して同じインスタンスである必要があります。QScriptEngineの = 演算子はプライベートです。または、ポインターをすべて一緒に回避します。

別のSOの質問で、共有ポインタ(boost::shared_ptrおよび)に関する情報を見ました。std:tr1::shared_ptr私はすでに正規表現ライブラリにブーストを使用しているので、これがこれに対処する最善の方法である場合、ブーストは問題外ではありません。一般的な C++ の知識と将来のプロジェクトのために、ブースト以外の方法があることを願っています。

4

1 に答える 1

4

これを解決するには、クラスの 1 つ (クラス A) にそのポインターの有効期間の制御と、「getter」メソッドを使用します。もう一方のクラス (クラス B) は、ポインターが必要なときは常に A のゲッターを呼び出します。そうすれば、A は常にポインターを制御できます。欠点はゲッター関数です (おそらくインライン化されますが、それでも 2 番目の間接化です)。また、B はほとんどすべての使用で NULL のポインターをチェックする必要があります。

もう 1 つの選択肢は、boost::shared_ptr のようなものでポインターをラップすることです。これは、基になるポインターを保持し、そのポインターを共有するすべてのオブジェクトが削除されたときにのみ削除することで、(適切に使用された場合) 問題を処理します。これを自分で書くこともできますが、すでにブーストがプレイされているので、それらの実装をそのまま使用します。

3 つ目の選択肢は、共有ポインターが不要になるように全体をリファクタリングすることです。個人的には、共有ポインターを必要とする C++ プログラムを設計することは決してありません。なぜなら、共有ポインターは、メモリ管理のバグが何年にもわたって簡単に侵入できる場所だからです。しかし、それは私だけです。

于 2009-10-30T02:16:45.923 に答える