公共结构继承私有结构C ++

时间:2015-08-21 20:50:17

标签: c++ inheritance struct forward-declaration

我有一个类来控制设备的所有IO。当一个线程发出IO请求时,它会被添加到FIFO队列,以防当时正在处理另一个IO请求。一旦IO请求完成,它就会从队列中弹出,并处理下一个IO请求。

离开无关的功能,成员变量和ctors / dtors,我的班级就像这样:

class IOInterface
{
  public:
    struct ReadRequest: public IORequest
    {
      ReadRequest(int a, int b)
        : IORequest(a, b) {}
    };

    struct WriteRequest: public IORequest
    {
      WriteRequest(int a, int b)
        : IORequest(a, b) {}
    };

    void makeIORequest(IORequest request);

  protected:
    void performIO(ReadRequest request);
    void performIO(WriteRequest request);
    std::queue<IORequest> m_ioQueue;

  private:
    struct IORequest
    {
      IORequest(int a, int b)
        : m_a(a), m_b(b) {}
      int m_a;
      int m_b;
    }
}

(这不是我的代码的精确副本,因此我认为它不会按原样编译)

这个想法是能够有一个线程来检查队列是否有请求然后只是调用:

performIO(m_ioQueue.front());

问题是在编译时编译器不知道IORequest在进入ReadRequest和WriteRequest时是什么。我不能只将类的私有部分移到顶部,因为重载的performIO函数不知道ReadRequest和WriteRequest是什么。

我想保持IORequest私有,这样当IOInterface类被继承时,它永远不会被实例化。

通常这可以通过前向声明解决,但是如何在保持私有的同时转发声明IORequest?

前向声明是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

您的类未编译的原因是私有struct的定义是在您继承它的地方之后的文本上。将私有部分移动到类的顶部,因此它将编译:

class IOInterface {
  private:
    struct IORequest {
      IORequest(int a, int b)
        : m_a(a), m_b(b) {}
      int m_a;
      int m_b;
    };
  public:
    struct ReadRequest: public IORequest {
      ReadRequest(int a, int b)
        : IORequest(a, b) {}
    };

    struct WriteRequest: public IORequest {
      WriteRequest(int a, int b)
        : IORequest(a, b) {}
    };

    void makeIORequest(IORequest request);

  protected:
    void performIO(ReadRequest request);
    void performIO(WriteRequest request);
    std::queue<IORequest> m_ioQueue;
};

Demo.