2015-08-21 101 views
2

我有一个类来控制所有的IO来自/来自设备。当线程发出IO请求时,它将被添加到FIFO队列中,以防当时处理另一个IO请求。只要IO请求完成,它就会从队列中弹出,并处理下一个IO请求。公共结构继承私有结构C++

留出多余的功能,成员变量,并构建函数/ 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

你的班级没有编译的原因是私人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.