Public 结构继承私有结构 C++

Public structs inheriting private struct C++

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

排除无关函数、成员变量和 ctors/dtors,我的 class 布局如下:

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());

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

我想将 IORequest 保密,这样当这个 IOInterface class 被继承时,它永远不会被实例化。

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

前向声明是执行此操作的正确方法吗?

您的 class 没有编译的原因是私有 struct 的定义在文本上位于您继承它的位置之后。将私有部分移动到 class 的顶部,这样它就可以编译:

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.