烦请各位看下这个抽象有没有更好的实现?
需求是这样的,需要定义一个抽象的PeerId,PeerId的具体实现不确定,从上层来看,PeerId只要能够实现比较就OK了,因此,抽象PeerId的定义如下:
struct PeerId
{
virtual bool operator==(const PeerId& p) = 0;
};
这样,上层实现就可以不用关心具体的实现,这没问题。
不过有个比较棘手的问题,具体的PeerId需要使用dynamic_cast:
class XXXPeerId : public PeerId
{
public:
XXXPeerId(int i) : a(i) {}
bool operator==(const PeerId& p)
{
try
{
const XXXPeerId& xp = dynamic_cast<const XXXPeerId&>(p);
return a == p.a;
}
catch (...)
{
return false;
}
}
private:
int a;
};
从代码实现看,这显然不是一个好的设计,各位看下有没有更好的设计方案,谢谢!
class 设计
[解决办法]
声明成这样不行吗?
bool operator==(const XXXPeerId& p)
[解决办法]
1、如果p不是XXXPeerId的相关类,何从比较?
2、dynamic_cast放的地方不对啊,这个应该放到外面。c++本质上是没有rtti的。
3、如果你想把不同的事物进行比对,只能在PeerId上进行。同时弄个虚函数get_id。
4、异常处理是不能乱用的,这不是java,就算是java能不用catch就尽量不用。这个开销太大了。