【发布时间】: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