クラスが7つ以上のクラスのベースクラスとして動作できないという制限があります。 コンパイル時に上記の規則を適用する方法はありますか?コンパイル時に継承を望ましいクラス数に制限する
私はAndrew KoenigのUsable_Lock技法が、クラスが継承されないようにすることを知っていますが、クラスをインスタンス化しようとすると失敗するだけです。これは自分自身を派生させるときにできないのですか?
ベースクラスは、誰がその子であるかを知ることができます。だから私たちは友達の組み合わせを宣言することができると思います クラスと、このルールを強制するためにカプセル化します。このようなものを試してみることにしましょう。012 CC番号を派生させると、コンパイラの警告abtにアクセスできないdtorが生成されます。その後、コンパイラの調整(エラーのすべての警告にフラグを立てるようなもの)を使用して、このような警告をエラーとしてフラグを立てることができますが、そのような手法に頼るのは嫌です。
もう一つの方法が、私にはむしろ不器用に見えるのである: -
class B;
class InheritanceRule{
class A {
public:
A() {}
~A() {}
};
friend class B;
};
class B {
public:
class C : public InheritanceRule::A
{};
};
class D : public InheritanceRule::A{};
クラスDの導出が派生するすべてのクラスは、クラスBの内側に導出されなければならないという意味、コンパイラエラーとしてフラグが付けられますこれにより、クラスAから派生したクラスの数を少なくとも検査することが可能になりますが、それ以上の追加を妨げることはありません。
誰でもこれを行う方法がありますか?ベースクラスが、誰がその子供であるかを知る必要がなければ、さらに良い。
注:ベースクラスとして機能するクラス自体は、インスタンス化することもできます(抽象クラスではありません)。予め
おかげで、
EDIT-1:コメント1としてjon.hから、わずかな修正
様々な静的コード分析ツールの// create a template class without a body, so all uses of it fail
template < typename D>
class AllowedInheritance;
class Derived; // forward declaration
// but allow Derived by explicit specialization
template<>
class AllowedInheritance< Derived> {};
template<class T>
class Base : private AllowedInheritance<T> {};
// privately inherit Derived from that explicit specialization
class Derived : public Base<Derived> {};
// Do the same with class Fail Error
// it has no explicit specialization, so it causes a compiler error
class Fail : public Base<Fail> {}; // this is error
int main()
{
Derived d;
return 0;
}
なぜ7ですか? – Shog9
>注:基本クラスとして機能するクラス自体は、インスタンス化することもできます(抽象クラスではありません)。 お待ちください、真剣に?あなたは考えられる目的を果たさないサブクラスの数について任意のルールを持っていますが、ベースを抽象化するのではありません。 – tpdi
@ Shog9:なぜそれが7だけであるのか分かりません。プロジェクトのアーキテクトはnos> 7のようには思えません:-) @tpdi:候補ベースクラスは常にiterfaceであるとは限りません。 正直なところ、私はこの背後にあるコンセプトを理解していません。それは、不当な継承を嫌うプログラマーを託すことを除いてですが、後で取り上げます。現在、私は解決策があるかどうかを確認しようとしています。 – Abhay