在下面的代码片段中,我确实需要通过工厂方法实例化对象以调用选定的适配器(即 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) 不要使用本地裸指针,总是使用智能指针。下面是 相同的实现链接。
关于c++ - 通过工厂方法的对象实例化没有给出期望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50712811/