C ++如何实现这个接口配置?

时间:2010-10-21 15:14:15

标签: c++ inheritance

我当然不知道如何标题这个问题,抱歉。

我在设计以下系统时遇到了一些问题。

我需要一个可以完成一些工作的课程,但是这项工作可以通过一系列不同的方式完成,比如说这项工作将通过“司机”完成。

这些驱动程序可以有不同的接口,因此我需要为每个驱动程序构建一个包装器。

所以我得到了(或者我需要):

       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();
  1. 这是一个有效的C ++配置还是迟早会有问题? 基本上,令我担心的是从Driver_Interface创建不同类型的驱动程序,我发现它会自动投射并且没有人抱怨......
  2. 实际上我现在有一些问题正在编译,臭名昭着的vtables没有在Driver_0中定义......这与我想要达到的目标有什么关系吗? 更新:我通过删除* Driver_Interface *构造函数来修复此问题。

3 个答案:

答案 0 :(得分:3)

对我来说,你的基本想法似乎很好。我会考虑将驱动程序的创建分为factory(或至少factory method)。

答案 1 :(得分:1)

这对我来说似乎很合理。具有FactoryMethod或类(AbstractFactory)基于某个配置值创建所需具体子类的对象是一种常见模式。

您可以考虑让MainClass实现类似

的内容
DriverInterface* createDriver(const string& driverType)

而不是在DriverInterface中封装生成的具体MainClass子类。但是如果你只想要一个具体的DriverInterface实例,那么上面看起来很好。

答案 2 :(得分:0)

我会将“driver_0”传递给构造函数,并从那里调用MainClass :: set_driver。然后,您可以将MainClass :: set_driver设为私有,除非您需要更改驱动程序。