26

コピー不可能なメンバーをクラスに追加すると、コピー構築および代入演算子の自動生成が妨げられます。コピー不可を使用するためにブーストが継承を必要とするのはなぜですか?

文体の好みは私だけではないと思います

class MyUtility : public MyBase
{
   noncopyable guard;
   ...
};

とは対照的に

class MyUtility : public MyBase , private noncopyable
{
   ...
};

Dave Abrahams は頭の良い人なので、おそらくこの可能性を考慮したでしょう。私は何が欠けていますか?継承は何を達成しますか?

4

6 に答える 6

33

なぜならsizeof(boost::noncopyable)!=0。したがって、この場合、クラスのサイズは大きくなります。

ここでは、空のベースの最適化について読むことができます。(セクション「4.7: 空のメンバーの最適化」を参照してください)。

編集:コピー不可にはパブリック コンストラクターがないため、他の用途には役に立たなくなりますが、パブリック コンストラクターを持つクラスは他の間違った目的にも使用できます。これが、boost がこのアプローチを選択したもう 1 つの理由です。

于 2011-01-28T15:12:29.427 に答える
23

メンバーとして使用できる場合noncopyableは、パブリックの既定のコンストラクターとデストラクターが必要になります。noncopyableそうすれば、デストラクタが仮想化されていなくても、インスタンスを作成したり、ポリモーフィックな基本クラスとして使用したりすることができます。パブリック メンバーを使用しない実装は、単にポリシー クラスとしてのみ使用されることを保証します。

于 2011-01-28T15:29:14.460 に答える
4

最も明白な理由は、派生クラス「isA」がコピー不可能であるため、継承を使用することが最も理にかなっているということです。このように使用してもクラスのサイズが大きくならないという事実は、今日の考慮事項でもあります (ただし、空の基本クラスの最適化に先立って、コピー不可であると思います)。

于 2011-01-28T16:42:11.923 に答える
4

個人的には、boost 構文の方が好きです。継承は、いくつかのプロパティまたは機能をクラス全体に追加する方法であり、コピー不可はそのような機能です。コピー不可能なメンバーはトリッキーに思えます (実際にはメンバーを追加したくありません。これはトリックです)。継承は、設計された目的のために正確に使用されます。

于 2011-01-28T16:05:09.950 に答える
0

指定を省略するprivateと、ほぼ英語のようになります。

// English: this is my car, it is not copyable
class MyCar: noncopyable {};

// my truck is noncopyable, did i mention it's also a vehicle?
class MyTruck: noncopyable, public MyVehicle {};

// My airplane is a vehicle, BTW it's not copyable
class MyAirplane: public MyVehicle, noncopyable {};
于 2011-02-01T17:53:10.540 に答える