1

私は、クラス、AおよびB、パブリックBからメンバーを継承する必要がありAます。

class A {
public:
    int a;
};

class B : A {
};

継承されたすべてのメンバーをAstatic の下で作成する方法はありますか、またはそれらをB作成することが唯一の方法ですか?staticA


コンテキスト:

私はメモリ マネージャを構築しています。このマネージャは、特定のクラスのインスタンスによって使用されるメモリを制御します。

私は次のようなものがあります:

template <class T>
class Memory {
public:
    operator new;
    operator delete;
private:
    memory_pool_for<T>;
};

class Data : Memory<Data> {
};

それで、次のようなことをしなければならなくなったとき:

new Data;
delete Data;

操作は、で定義された関数から呼び出され、Memory一部のメモリ空間を割り当て/割り当て解除します。

割り当て/割り当て解除はインスタンス間で静的である必要があり、 からの継承によりDataの各インスタンスに余分なバイトが追加されないようにしたいと思います。だからこそ、「相続の化」を考えたのです。DataMemorystatic

これが私がやっていることを行うための最良の方法であるかどうかはわかりませんが、これは私が今まで考えた中で最もエレガントなアプローチです.

4

1 に答える 1

4

継承の代わりに構成を使用します。

class B { 
    static A a;
};

とにかく、継承されたメンバーを作成したい場合は、おそらく B でLSPを満たさないでしょうstatic


コンテキストに関しては、静的に保護されたアロケーターを次のように作成しますMemory

class Memory {
protected:
    static void* allocate();
    static void destroy (void*);

newanddelete演算子でそれらを使用します。

public:
    void* operator new (size_t) { return allocate(); }
    void operator delete (void* mem) { return destroy(mem); }
}

このようにして、 から継承するときに、Memoryその静的アロケーターを使用できます。

とにかく、それが良いアプローチかどうかはわかりません。明らかに、メモリ プールを 1 つに制限します (しかし、それはとにかく望んでいたことですよね?)。type ごとに 1 つのメモリ アロケータ インスタンスが必要な場合は、テンプレート タグを追加Memoryして CRTP で継承するだけです。

template<typename Tag> class Memory { ...

class Data : Memory<Data> {
};

ただし、標準ライブラリのコンテナー アロケーターがどのように使用されているかを確認することをお勧めします。stdlib と互換性があることは常に良いことです。

于 2013-03-29T16:58:49.123 に答える