我當然不知道如何標題這個問題,對不起。C++如何實現這個接口配置?
我在設計以下系統時遇到了一些問題。
我需要一個能完成一些工作的類,但是這項工作可以通過一系列不同的方式完成,比如說這項工作將通過「驅動程序」完成。
這些驅動程序可以有不同的接口,因此我需要爲每個驅動程序構建一個包裝。
所以我得到了(或者我需要)這樣的:
Me ---> MainClass ----> Wrapper ----> Drivers
MainClass是類,我會觸摸並呼籲通過不同包裝的驅動程序的方法。
這裏使用的例子:
MainClass worker;
worker.set_driver("driver_0");
worker.start_process(); //Start process calls a wrapper method which calls a driver's method.
要做到這一點我做了一個接口類:
class Driver_Interface : public QObject
{
Q_OBJECT
public:
Driver_Interface(QObject* parent=0) : QObject(parent){}
virtual bool open()=0;
virtual bool close()=0;
virtual bool write()=0;
virtual bool set_config()=0;
};
一個驅動封裝具有這樣的形狀:
class Driver0 : public Driver_Interface
{
Q_OBJECT
public:
Driver0(QObject* parent=0);
Driver0();
bool open();
bool close();
bool write();
bool set_config();
};
終於來了衝突點,定義MainClass: 我想避免創建每個包裝一員,所以我想這一點,而現在的編譯器不抱怨:
class MainClass
{
public:
MainClass();
~MainClass();
void init();
void set_driver(const QString&);
void start_process();
protected:
QString driver_str;
Driver_Interface* driver; //!<--- Here Here!!!
};
當設置驅動器選擇,我這樣做:
if(driver_str.compare("driver_0")==0)
this->driver = new Driver_0();
- 這是一個有效的C++配置還是遲早會有問題? 基本上,我擔心的是從Driver_Interface創建不同類型的驅動程序,我看到它會自動投射並且沒有人投訴...
- 其實我現在編譯時有一些問題,臭名昭着的vtable沒有定義在Driver_0中......這與我想實現的目標有一些關係嗎? 已更新:我通過刪除* Driver_Interface *構造函數來解決此問題。
爲什麼使用字符串來指定驅動程序?您是否閱讀用戶輸入的驅動程序選擇? – wilhelmtell 2010-10-21 15:23:18
只是爲了懶惰,我知道我應該使用ENUM舉例,但我只是從這開始。 – 2010-10-21 15:29:46