读书人

烦请诸位看下这个抽象有没有更好的实现

发布时间: 2013-09-14 13:03:22 作者: rapoo

烦请各位看下这个抽象有没有更好的实现?

需求是这样的,需要定义一个抽象的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就尽量不用。这个开销太大了。

读书人网 >C++

热点推荐