簡體   English   中英

C++ 從字典中返回 object 的新實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM