【问题标题】:Public structs inheriting private struct C++公共结构继承私有结构 C++
【发布时间】:2015-08-21 20:50:16
【问题描述】:

我有一个控制设备的所有 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());

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

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

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

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

【问题讨论】:

    标签: c++ inheritance struct forward-declaration


    【解决方案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.

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 2023-03-20
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2011-08-10
      • 2019-08-24
      相关资源
      最近更新 更多