![](/img/trans.png)
[英]Is there a right way to return a new object instance by reference in C++?
[英]C++ return new instance of object from dictionary
如何在 C++ 中實現這樣的功能? 我想要一些方法來根據提供的字符串返回 object 的實例。 我懷疑map
可能是解決方案,但我不知道如何將方法傳遞給它?
class Container {
dictionary = {
A: () => new A(),
B: () => new B(),
C: () => new C(),
};
method(choice: string): Parent {
return this.dictionary[choice];
}
}
class Parent {}
class A extends Parent {}
class B extends Parent {}
class C extends Parent {}
我可以提出以下解決方案:
一個基礎 class:
class Base {
}
一家工廠 singleton:
class Factory
{
public:
static Factory &instance()
{
static Factory inst;
return inst;
}
bool Register(const std::string &name, CreateCallback funcCreate)
{
m_classes.insert(std::make_pair(name, funcCreate));
}
Base* CreateInstance(const std::string &name)
{
auto it = m_classes.find(name);
if(it != m_classes.end())
{
return it->second();
}
return nullptr;
}
private:
using CreateCallback = Base *(*)();
std::map<std::string, CreateCallback> m_classes;
}
#define CLASS_IMPL(T) Base *T::CreateMethod() { return new T(); }
#define REGISTER_CLASS(T,N) bool T::m_registered = Factory::instance().Register(N, &T::CreateMethod);\
CLASS_IMPL(T)
#define CLASS_DECL protected: \
static Base *CreateMethod(); \
static bool m_registered; \
用法:class 聲明:
class A: public Base
{
BASE_DECL
public:
A(){}
}
class 定義:
REGISTER_CLASS(A, "A");
A::A() : Base()
{
}
以這種方式創建其他類。
用法:
Base* a = Factory::Instance().CreateInstance("A");
這是工廠實現,因此是一種“自我注冊”模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.