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;
};
我有一个 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;
};