c++ - 通过工厂方法的对象实例化没有给出期望的结果

标签 c++ design-patterns factory

在下面的代码片段中,我确实需要通过工厂方法实例化对象以调用选定的适配器(即 adapterTwovalue)但是在通过工厂方法调用时我无法获得所需的结果.当我们分配静态声明对象的地址(即 adapter = &at)时,它可以工作,但对于工厂,我通常会得到空白输出。 我也尝试使用 (adapter = new adapterTwo()) 实例化对象,但输出字符串给出空白结果。根据我的要求,我需要填充 connect 函数中的所有 getter,这是用于构建响应的纯虚函数。任何人都可以建议如何使用工厂方法实现此目的。

    #include <iostream>

    using namespace std;

    class IAdapter
    {
    public:
        enum FactoryList { AdapterOnevalue = 0, AdapterTwovalue };
        virtual void connect() = 0;
        static IAdapter* CreateList(FactoryList);
        virtual ~IAdapter() {}
    };

    class LibraryOne
    {
        string property;
    public:

        void SetConnection(string property)
        {
            this->property = property;
        }

        string getConnection()const
        {
            return property;
        }

    };

    //LibraryTwo
    class LibraryTwo
    {
        string broker;
    public:
        void SetBroker(string broker1)
        {
            this->broker = broker1;

        }

        string getBroker() const
        {       
            return broker;
        }


    };
    //adapterOne
    class AdapterOne : public IAdapter
    {
        LibraryOne one;
        string constring;
    public:

        void SetClientconnection(string constring)
        {
            one.SetConnection(constring);

        }

        string GetClientconnection()
        {

            return one.getConnection();

        }


        void connect()
        {

            constring = GetClientconnection();

        }
    };


    //Adapter to use library two
    class AdapterTwo : public IAdapter
    {
        LibraryTwo two;
        string brokerstring;
    public:

        void SetClientbroker(string constring)
        {
            two.SetBroker(constring);

        }

        string GetClientbroker()
        {

            return two.getBroker();

        }

        void connect()
        {

            string constring = GetClientbroker();
            cout << "final value=" << constring;

        }
    };

    IAdapter* IAdapter::CreateList(FactoryList SelectList)
    {
        IAdapter *ListObject;

        switch (SelectList)
        {
        case AdapterOnevalue:

            ListObject = new  AdapterOne();
            break;
        case AdapterTwovalue:
            ListObject = new AdapterTwo();

            break;
        default:
            ListObject = NULL;

        }

        return ListObject;

    }

    int main()
    {
        IAdapter *adapter = 0;
        //LibraryTwo obj;
        AdapterTwo at;
        at.SetClientbroker("amqp");
        //cout << at.GetClientbroker();
        //adapter = &at;   it works 
        adapter = IAdapter::CreateList(IAdapter::AdapterTwovalue);//it doesn't work
        //Just do the operation now
        adapter->connect();

        return 0;
    }

最佳答案

您可以在下面的分享链接中看到完整的解决方案。

http://coliru.stacked-crooked.com/a/d8b9d32a1fa989c9

这里是解释。

(1) setClientBroker() 或所有其他与适配器相关的 setter 功能需要作为接口(interface)中的虚函数实现,默认参数值为“”(空字符串)。

(2) 您需要始终在派生类中为 setter 使用 override 关键字 (c++11) 功能,以便编译器在编译期间交叉检查是否覆盖了正确的虚方法。

(3) 不要使用本地裸指针,总是使用智能指针。下面是 相同的实现链接。

http://coliru.stacked-crooked.com/a/2feea991ee90d4a2

关于c++ - 通过工厂方法的对象实例化没有给出期望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50712811/

相关文章:

java - 是否可以从工厂创建一个单例实例

java - 如何创建工厂方法来用功能替换构造函数?

c++ - 如何覆盖基类成员的类型?

c# - 实时数据记录设计方法?

c++ - 我可以让 Doxygen 合并不同文件中的命名空间内容吗?

java - 具有特定行为的状态机的良好设计模式

java - 在哪里可以找到使用模式的任务

json - 如何在 AngularJS 中使用工厂和 $http 访问 JSON 文件中的数据?

c++ - 如何在不导出类的情况下声明由多个线程调用的 C++ DLL 的内部类

c++ - 使用 git 进行 VS2010 项目 : Can't add file *. opensdf