【发布时间】:2014-10-05 03:54:59
【问题描述】:
我想用 C++ 编写一个 ServiceLocator 设计模式类。 目的是提供三种方法:
CServiceLocator::push(obj);
CServiceLocator::get<IObjType>();
CServiceLocator::getAll<IObjType>();
我更喜欢保留引用而不是对象的指针。所以我想使用引用对象的 std::vector 。为了做到这一点,我创建了一个 std::vector 但我无法编译,我在网上看到我无法将引用转换为 (void*)。
这是我班级的代码:
class CServiceLocator
{
public:
virtual ~CServiceLocator(){}
template <class T>
static void push(T &object)
{
m_objectList.push_back((void*)object);
}
template <class T>
static T & get()
{
for (std::vector<void*>::iterator it = m_objectList.begin(); it != m_objectList.end(); it++)
{
//on essaie de faire un dynamic cast pour trouver le premier objet du bon type
try
{
T & obj = (T&)dynamic_cast<T>(*it);
return obj;
}
catch (std::bad_cast &)
{
//il n'est pas du bon type
}
}
}
template <class T>
static std::vector<T&> & getAll()
{
std::vector<T&> result;
for (std::vector<void*>::iterator it = m_objectList.begin(); it != m_objectList.end(); it++)
{
//on essaie de faire un dynamic cast pour trouver les objets du bon type
try
{
T & obj = (T&)dynamic_cast<T>(*it);
result.push_back(obj);
}
catch (std::bad_cast &)
{
//il n'est pas du bon type
}
}
return result;
}
private:
CServiceLocator() {}
static std::vector<void*> m_objectList;
};
这是预期结果的使用示例
A a;
B b;
CServiceLocator::push<A>(a);
CServiceLocator::push<B>(b);
A &a1 = CServiceLocator::get<A>();
有人知道怎么做吗?
【问题讨论】:
-
A a();不创建对象。它声明了一个名为a的函数,它返回一个A类型的对象,并且不接受任何参数。要使用默认构造函数创建对象,请去掉括号。即A a;或B b; -
你是对的,它已得到纠正,但这不是问题的目的......
-
这就是为什么它不是一个答案,而是一个评论。
标签: c++ vector reference service-locator