我有一个类来控制设备的所有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?
前向声明是正确的方法吗?
答案 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;
};