【发布时间】:2011-10-04 16:16:40
【问题描述】:
我有一些设计问题,我想你们中的某个人可能有一些线索可以帮助我。
我试图将我的问题总结为这个简单的例子:
我有两个不同的类 DerivedOne 和 DerivedTwo,它们继承自同一个 Base 类并共享一个方法的定义。
我有一组shared_ptr 指向client,其中一个对象来自两个不同的类DerivedOne 和DerivedTwo。
因为我不想使用Base* 指针来保存这两个不同的类,所以我尝试制作客户端类模板。
但我有 2 个不同的班级,我不能将它们放在同一个集合中。
我以为shared_ptr 可以在不指定模板参数的情况下保存对象指针,但我错了,或者我不知道该怎么做。
我看到的另一个解决方案是将这 2 个不同的 client 分成 2 个不同的 set
提前感谢您的任何建议。
代码如下:
#include <iostream>
#include <set>
#include <boost/shared_ptr.hpp>
class Base
{
public:
virtual void test() = 0;
};
class Derived_one
: public Base
{
public:
void test() {
std::cout << "Derived One" << std::endl;
}
};
class Derived_two
: public Base
{
public:
void test() {
std::cout << "Derived Two" << std::endl;
}
};
template <class temp_arg>
class Client
{
public:
int test(){
obj_.test();
}
protected:
temp_arg obj_;
};
typedef Client<Derived_one> ClientOne;
typedef Client<Derived_two> ClientTwo;
/// Here I don't want to specify any of the two previously declared client :
//typedef boost::shared_ptr<Client> Client_ptr;
typedef boost::shared_ptr<ClientOne> Client_ptr;
int main(int, const char**)
{
std::set<Client_ptr> Clients_;
Client_ptr client_(new ClientOne());
Clients_.insert(client_);
client_->test();
return 0;
}
如果你想看一下真实代码:
https://github.com/gravitezero/Node/tree/experimental/srcClient对应connectionBase 类是 message
两个派生类是peply 和request。
【问题讨论】:
-
为什么你不想使用基指针,它可以指向派生类对象?
-
出于某些原因我不想使用指针。一个是我不想要
dynamic_cast,这个指针可能指向dynamic_cast。另外,我想要一个组合,而不是客户端和派生对象之间的聚合。 -
@EtienneBrodu 如果您需要
dynamic_cast,您的设计在另一个地方有问题,但在您向我们展示的地方却没有。指针在这里是一个非常合理的决定。
标签: c++ templates shared-ptr