设计问题:消息处理组件..调用不正确的重载函数
Design Question: Message processing components... calling incorect overloaded function
我正在写一个消息处理程序。主要组件是接收器、处理器、过滤器、翻译器和发送器。我希望在处理器组件的"进程"功能上有一个单点故障,用于捕获异常、日志记录和度量
正下方是控制台输出,显示出我有点过头了。
BASE
A
B
A
---FILTER---
FILTERED BASE
DID NOT FILTER A
Looks like a B <------THIS IS WHAT I WANT
DID NOT FILTER B
---PROCESS---
FILTERED BASE
DID NOT FILTER A
DID NOT FILTER B <-----THIS MAKES ME SAD
这些是类别定义
#include <string>
#include <iostream>
#include <memory>
//**************MESSAGES ************************
class Message
{
public:
virtual std::string getOut() const {return std::string("BASE");};
};
class MsgA : public Message
{
public:
std::string getOut() const {return std::string("A");};
};
class MsgB : public Message
{
public:
std::string getOut() const {return std::string("B");};
};
//**************FILTERS ************************
class MsgFilter
{
public:
void filter(const std::tr1::shared_ptr<Message> msg)
{
if( msg->getOut().compare("BASE") == 0 )
{
std::cout << "FILTERED BASE" << std::endl;
}
else
{
std::cout << "DID NOT FILTER " << msg->getOut() << std::endl;
}
}
void filter(const std::tr1::shared_ptr<MsgB> msg)
{
std::cout << "Looks like a B" << std::endl;
filter((std::tr1::shared_ptr<Message>)msg);
}
};
//**************PROCESSORS ************************
class MsgProcessor
{
public:
MsgProcessor():myFilt(MsgFilter()){}
MsgFilter myFilt;
virtual void process(std::tr1::shared_ptr<Message> msg)
{
myFilt.filter(msg);
}
};
以下是的主要功能
#include "AllClassDefs.h"
int main(int argc, char *argv[])
{
std::tr1::shared_ptr<Message> msg(new Message());
std::tr1::shared_ptr<MsgA> msgA(new MsgA());
std::tr1::shared_ptr<MsgB> msgB(new MsgB());
std::cout << msg->getOut() << std::endl;
std::cout << msgA->getOut() << std::endl;
std::cout << msgB->getOut() << std::endl;
std::tr1::shared_ptr<Message> msgAPtr(msgA);
std::cout << msgAPtr->getOut() << std::endl;
std::cout <<"nnFILTER---n";
std::tr1::shared_ptr<MsgFilter> flt(new MsgFilter());
flt->filter(msg);
flt->filter( (std::tr1::shared_ptr<Message>) msgA);
flt->filter(msgB);
std::cout <<"nnPROCESS---n";
std::tr1::shared_ptr<MsgProcessor> prc(new MsgProcessor());
prc->process(msg);
prc->process(msgA);
prc->process(msgB);
}
所以。。。我希望进程函数调用Filter(MsgB(函数,而不是Filter(Message(函数。通过使用process(Message(函数,看起来Filter将MsgB视为Message。我怎样才能让它正常工作?
我知道我可以使用模板,但这似乎有点过头了。。。另外,在一个有几百个消息类的系统中,它可能会导致一个大的exe。我应该使用双重调度吗?或者有更简单的解决方案吗?
您的问题是过载解决是在编译时执行的,所以这个函数
virtual void process(std::tr1::shared_ptr<Message> msg)
将始终调用相同的过载
void filter(const std::tr1::shared_ptr<Message> msg)
因为它与参数的静态类型相匹配。
msg
有时是否碰巧指向派生类并不重要。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 取消引用运算符不能重载
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- 使用 C++ 中的运算符重载显示不正确的结果
- 模板实例化失败:编译器选择不正确的重载函数
- 尝试访问类的私有成员以消除重载是否格式不正确
- 重载解析不正确,const 参数的值为 0
- 为什么编译器在这种情况下选择了不正确的函数重载
- 比较函数使用重载运算符返回不正确的结果
- 在重载解析中,选择使用不明确转换序列的函数是否必然会导致调用格式不正确
- "anti-SFINAE"在给定表达式格式不正确时启用重载
- 设计问题:消息处理组件..调用不正确的重载函数
- 为什么此构造函数重载解析不正确
- MSVC 2015 为 std::vector 选择不正确的构造函数重载
- 如何在Python中重载不正确的c++虚函数时从SWIG中获得正确的错误
- 2参数函数的重载解析不正确