0

一部のインクルード依存関係を排除するために、前方宣言とdポインターを使用しようとしています。多くの場所で読みやすさのためにXListtypedefを使用したことを除いて、すべてがうまく機能しています(例:) typedef QList<X> XList

typedef前方宣言の問題の回避策は、継承を使用することですclass XList : public QList<X>{};。QListには非仮想デストラクタがあります。Qt自身のQStringListが継承QList<QString>し、ヒープにXListsを割り当てていないという事実を考えると、この回避策に問題がありますか?XListクラスへのヒープ割り当てを明示的に禁止する必要がありますか?

4

2 に答える 2

1

XListこのように定義するとどうなるか見てみましょう。

class XList : public QList<X> {};

以下は期待どおりに機能します。

  XList* x = new XList;
  delete x;

ただし、次のことはできません。

  QList<X>* q = new XList;
  delete q;

QList<X>のデストラクタは呼び出されますが、呼び出されない場合は呼び出されXListます。これが、基本クラスの仮想デストラクタが行うことです。

ヒープ割り当てを使用したことがない場合は問題ありませんが、フォローしているメンテナ(または数か月後には自分自身)のためにトラップを準備しています。

この仮定が文書化されていることを確認し、前述のようにヒープのインスタンス化を防ぐためにXListnew演算子をプライベートにします。

安全な代替手段はQList<X>、のメンバーを作成するXListことです。つまり、継承よりもカプセル化を優先します。

于 2010-01-27T17:43:21.413 に答える
0

QStringList独自のデストラクタを定義しません。この場合、QList多態的に使用されていても(blue.tuxedoの例を参照)、派生クラスのデストラクタが呼び出されなくても、定義されていないため、問題はありません。

あなたの場合、派生クラス(XList)にデストラクタが必要な場合、問題が発生します。ここで、宣言型定義を転送できないことを回避する方法についての以前の議論がありました:

C++でのtypedefの前方宣言

派生クラスを作成することを避けることができれば、長期的にはより良いかもしれません。

于 2010-01-27T17:52:19.427 に答える