コンパイル時に2つの基本クラスのうちの1つだけから継承するC ++クラスを作成するにはどうすればよいですか?

Inq

初めての投稿。これは、C ++で何かを行う方法に関する一般的な質問です。あなたの時間を無駄にしないために、私はそれを一般化して尋ねます。しかし、「どうしてそんなに馬鹿なことをしたいの?」というような返事があったら、以下に詳しく説明します。

一般的な質問

共通コード(SPIBase)の基本クラスがあります。それを継承する2つのクラスがあり、実装が大幅に異なります(SPIMaster、SPISlave)。これらの2つのクラスのそれぞれで、同一のパブリック/保護された機能を公開します。 これら2つのクラスのいずれかからオプションで継承する単一のクラスを作成したいと思います。どうすればいいですか?

詳細

私はいくつかのマイクロエレクトロニクス(ESP8266)用のライブラリを構築しています。私はArduinoIDEを使用しており、ライブラリはC ++です。ご存知かもしれませんが、SPIは、2つのマイクロコントローラーまたはマイクロコントローラーとセンサーのようなものの間で通信するための方法論/プロトコルです。マイクロコントローラーは常にマスターであり、他のデバイス/センサーは常にスレーブです。マスターはSPIの通信プロセスを完全に制御します。スレーブは通常、比較的受動的です。私は、2つのESP8266マイクロコントローラー間でのみ機能するライブラリを作成して、TCP / IPのようなプロトコルを形成し、どちらかが一方の一方にメッセージを送信できるようにしました。基本的に、マスター/スレーブの問題は隠されており、ライブラリを使用する開発者は、プロトコルを好きな方法で、どちらの方向にもセットアップできます。(つまり、クライアント/サーバー/ピアメッセージング、送信/応答、ストリームなど)。

次に、ストリーム/ファイル転送を実装するレイヤーを作成します。このクラスは、2つの中間クラスのいずれかに乗るが、継承するクラスを除いて同一である。それらは両方とも送信者と受信者の両方になります。実装がまったく同じである2つの完全なクラスは必要ありません。この場合、コードの1つのチェーンのどの部分も他のデバイスに配置したくありません。調査の結果、基本的に不可能であることが証明された私の当初の考えは、開発者を使用するライブラリにメインプログラムファイルで#defineMASTERまたは#defineSLAVEを使用させ、ストリーミングクラスはこれに基づいていずれかのクラスを継承することでした。#definesがダウンストリームに表示されないことにすぐに気付きました。私が望む結果を得るC ++の設計方法/パターンはありますか?御時間ありがとうございます。

マイルズブドネク

テンプレートを使用できます。例えば:

template <typename SPIImpl>
class SPIStream : public SPIImpl
{
    // stream implementation using the common interface
};

次に、次のようにクラスのインスタンスを宣言します。

SPIStream<SPIMaster> spi_master_stream;

または

SPIStream<SPISlave> spi_slave_stream;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ