enum class
サブクラスがC++11属性を持ち、setter/getterが関連付けられるようにクラスを構築しようとしています。
class Base {
public:
enum class MyEnum {
A,
B
} my_enum;
Base() : my_enum(MyEnum::A) {}
MyEnum get() { return my_enum; }
void set(const MyEnum &ME) { my_enum = ME; }
};
class Derived : public Base {
public:
Derived(): Base() {
my_enum = MyEnum::B;
}
};
int main(int argc, char *argv[])
{
Derived Deriv;
// No problems!
Deriv.get() == Derived::MyEnum::B;
return 0;
}
ここまでは順調ですね!
ただし、派生クラスで列挙型クラスを再定義できるようにしたいのですがMyEnum
、setter / getter/attributeを常に再実装する必要はありません。
// Base as before
class Derived : public Base {
public:
enum class MyEnum {
C,
D
}; // intention: to override Base's "my_enum" attribute
Derived(): Base() {
my_enum = MyEnum::C;
// ERROR: cannot convert 'Derived::MyEnum' to 'Base::MyEnum'
}
};
int main(int argc, char *argv[])
{
Derived Deriv;
// ERROR: no match for 'operator==' for types 'Base::MyEnum' and 'Derived::MyEnum'
Deriv.get() == Derived::MyEnum::C;
return 0;
}
私は問題が何であるかを理解しています。この場合、コードを再利用できる最もクリーンな方法を探しています。
できれば、継承によってのみ(または、Base()から派生する行為によってのみ機能をDerived()クラスで使用できるようにする必要があります)。
助言がありますか?