1

重複の可能性:
「new」演算子を介してクラスが割り当てられないようにするにはどうすればよいですか?(RAIIクラスが常にスタックに割り当てられるようにしたいのですが。)

ライブラリにクラスを定義するとします

class Base {};

クラスをユーザーに公開します。

そして、1人のユーザーが新しいクラスを定義します

class Derived : public Base {}

ユーザーがヒープ上Baseのインスタンスを作成しないようにするにはどうすればよいですか?Derived

たとえば、これは許可されています

Derived dd;

これではありません

Derived* dd = new Derived();

ありがとう、

4

3 に答える 3

9

あなたができる最善のことはprivate operator new、基本クラスで a を宣言することだと思います (これが必要かどうかは思い出せませんが、通常、配列、および配置の 3 つすべてを実行することをお勧めします)。ユーザーは Derived クラスで独自operator newのクラスを作成することでこれを回避できますが、少なくともユーザーはそれについて考え、意図を覆すために積極的に作業する必要があります。

ヒープ上にクラスを作成する際の偶然ではない問題 (子クラスの悪意のある開発者など) が心配な場合、C++ はこのプロジェクトの言語ではありません。それは強力であり、エンドプログラマーが意図をバイパスしないことに頼らなければならない場所がたくさんあります。

于 2012-06-14T21:05:28.083 に答える
4

operator new基本クラスでプライベートにします。

class Base {
    void* operator new(size_t);
};
class Derived : public Base {
}

//...

Base* p = new Derived; //ERROR
Derived d;             //OK
于 2012-06-14T21:04:11.533 に答える
0

newでオペレータを非公開にするだけでなく、 の意図をBaseユーザに思い出させることができます。このように、 を使用している開発者は、意図が文書化されていないと主張することはできません。BaseBaseBase

class Base
{
    void * operator new (size_t) {}
    void * operator new[] (size_t) {}
    void * operator new (size_t, void *) {}
protected:
    struct I_promise_not_to_dynamically_allocate_Base {};
    Base (I_promise_not_to_dynamically_allocate_Base) {}
    virtual ~Base () {}
    //...
};

現在、開発者が を使用する場合Base、引数を渡す必要があります。

class Derived : public Base
{
public:
    Derived () : Base(I_promise_not_to_dynamically_allocate_Base()) {}
    //...
};

newすでに述べたように、開発者がオーバーロードすることを妨げるものは何もありませんdeleteが、そうすると約束を破ることになります!

于 2012-06-14T21:29:50.223 に答える