私には問題があることを教えてあげてください。私は、デジタルデバイスを制御する一連のクラスを設計しています。このデバイスは、2つの動作モードで動作します。第1のモードでは、特定の操作セットを実行することができ、第2のモードでは、別の操作セットを実行することができる。私はまた、実行時にデバイスのモードを変更することができますので、必要に応じて2つのモードを入れ替えることができます。モードとは無関係に、デバイスは同じレジスタセットを使用します。同じ名前のメンバーを持つ基本クラスからのC++多重継承
私はこの問題を各モードごとに1つの基本クラスで解決しようと考えていました。したがって、最初の操作セットが必要な場合はモード1のオブジェクトを、2番目の操作セットを必要とする場合はモード2のオブジェクトが必要です。そして、私はこれらの2つの基本クラスからクラスを派生することができたので、すべての操作を実行するオブジェクトを持つことができます。
私の設計の問題は、2つの基本クラスに共通の機能と同じレジスタへの参照があることです。私はメンバーの継承を防ぐことができないので、派生クラスに重複があります。私はスコープ演算子でアクセスする複製を選択できることを知っていますが、私はまだこれを悪い設計と考えています。
私の質問です:この問題を解決するための慣用的な方法はありますか?
これを解決する方法が簡単でない場合は、3つの階層的に独立した設計について考えています。重複したコードがいくつかありますが、それは大きな問題ではありません。説明のために以下の(簡体字)
コード:
class mode1
{
protected:
volatile uint8_t& reg1;
volatile uint8_t& reg2;
uint8_t data;
public:
virtual void operation1() final { // do something }
virtual void operation2() final { // do something }
virtual void operation3() final { // do something }
};
class mode2
{
protected:
volatile uint8_t& reg1;
volatile uint8_t& reg2;
uint8_t data;
public:
virtual void operation4() final { // do something }
virtual void operation2() final { // do something }
virtual void operation5() final { // do something }
};
class mode1and2 : public mode1, public mode2
{
public:
void operation6() { // do something }
void operation7() { // do something }
};
注モード1及び2はoperation2と共通のすべてのデータメンバを有します。
なぜすべての操作を実行するオブジェクトが必要ですか? – immibis
何を試しましたか? – Raindrop7
仮想継承を見てください。 –