【发布时间】:2011-08-04 15:17:52
【问题描述】:
众所周知,C++ 允许多重继承。
上下文
我正在实现一个处理网络,其中一些处理节点相互连接,以使用一种修改后的观察者模式交换不同的数据。
可以发送某种类型数据的节点是“DataSender”,然后扩展这个抽象类。
可以接收某种类型数据的节点是“DataReceiver”,然后扩展这个抽象类。
这是我的一段代码:
DataReceiver.h
template <typename TReceivedData>
class DataReceiver {
public:
void receiveData(TReceivedData* receivedData)
{
m_receivedData = receivedData;
}
TReceivedData* getReceivedData()
{
return(m_receivedData);
}
private:
TReceivedData* m_receivedData;
DataSender.h
template <typename TSentData>
class DataSender {
public:
void sendData(TSentData* sentData)
{
set<DataReceiver<TSentData>*>::const_iterator it;
for(it = m_receiverList.begin(); it != m_receiverList.end(); ++it)
(*it)->receiveData(sentData);
}
void addDataReceiver(DataReceiver<TSentData>* dataReceiver)
{
m_receiverList.insert(dataReceiver);
}
void removeDataReceiver(DataReceiver<TSentData>* dataReceiver)
{
m_receiverList.erase(dataReceiver);
}
private:
set<DataReceiver<TSentData>*> m_receiverList;
};
然后通过扩展这些抽象类中的一个或两个来简单地实现一个新节点。
问题
我想要一个发送“图像”和“文本”类型数据的节点:然后我有一个节点: 与:
class Node : public DataSender<Image>, DataSender<Text>
好吧,我想你已经看到了我的问题,编译不会允许这样做,因为如果我启动就会有歧义:
Node* node;
node->sendData(<my argument>);
因为它无法区分应该使用哪个 sendData() 和父类(来自继承)(这是多重继承的常见问题)。
1) 有没有办法使用 sendData() 来解决歧义(我不确定有没有?
2) 还有其他方法可以解决我的沟通问题吗? (我绝对希望有机会希望创建一个发送/接收数据的节点的最终用户可以通过扩展接口之类的东西轻松地做到这一点,并且数据应该位于不同的“通道”上:例如一个节点可以能够处理文本和图像,但只会发送图像...
感谢您的帮助,
朱利安,
【问题讨论】:
标签: c++ templates inheritance image-processing multiple-inheritance