目前我正在研究一个处于初始阶段的设计,下面是我到目前为止所做的一些作业,但它似乎不太好,我一直面临着一些问题。从下面的代码可以清楚地看出,设备工厂已用于设备对象和库对象的创建目的。 现在的工作是从工厂获取设备对象后,将调用连接函数,这将确保连接成功完成,现在任何相关的解析器(XML、JSON 或其他支持的解析器)都需要用于设备来获取数据。现在这两个任务(设备和库的选择)已经单独完成,所以现在的工作是我需要将选定的库强加给选定的对象,并且相同的赋值运算符已经在 Device 类中重载,但我收到错误“无法转换'库*' to 'Device*' in assignment”,同时将库对象分配给设备对象。除此之外,我还需要将 Library 类用作抽象类,这在当前实现中是不可能的。
#include<iostream>
#include<string.h>
using namespace std;
class Library
{
public:
virtual void lib_func();
virtual ~Library(){}
};
class JSON : public Library
{
public:
void lib_func()
{
cout<<"connect through USB"<<endl;
}
};
class JXML : public Library
{
public:
void lib_func()
{
cout<<"Connect through TCP"<<endl;
}
};
class XML : public Library
{
public:
void lib_func()
{
cout<<" connect through BT"<<endl;
}
};
class Device
{
public:
virtual void connect()=0;
const Device& operator =(const Device& obj);
virtual ~Device(){}
private:
Library * obj;
};
const Device& Device:: operator =(const Device& rhs)
{
Library *objorig=obj;
obj=new Library(*rhs.obj);
delete objorig;
return *this;
}
class D1: public Device
{
public:
void connect()
{
cout<<" connect through USB"<<endl;
}
};
class D2 : public Device
{
public:
void connect()
{
cout<<"Connect through TCP"<<endl;
}
};
class D3 : public Device
{
public:
void connect()
{
cout<<" connect through BT"<<endl;
}
};
class Devicefactory
{
public:
virtual Device* create_instance(const char* type)=0;
virtual Library* populate_library(const char* type)=0;
};
class factory : public Devicefactory
{
public:
Device* create_instance(const char* type)
{
if(!strcmp(type,"D1"))
{
return new D1();
}
else if(!strcmp(type,"D2"))
{
return new D2();
}
else if(!strcmp(type,"D3"))
{
return new D3();
}
return NULL;
}
Library* populate_library(const char* type)
{
if(!strcmp(type,"XML"))
{
return new XML();
}
else if(!strcmp(type,"JSON"))
{
return new JSON();
}
else if(!strcmp(type,"JXML"))
{
return new JXML();
}
return NULL;
}
};
int main()
{
Devicefactory *obj=new factory;
Device * object = obj->create_instance("D3");
Library *object1 = obj->populate_library("JSON");
object->connect();
object=object1;
object->lib_func();
delete object;
delete obj;
return 1;
}
最佳答案
我可能遗漏了一些东西,但在我看来你只需要向 Device
添加一个 setLibrary
成员函数:
void setLibrary(Library* library) {
obj = library;
}
然后在你的主函数中像这样使用它:
Device* object = obj->create_instance("D3");
Library* object1 = obj->populate_library("JSON");
object.setLibrary(object1);
我假设设备不应该拥有库,而您只是想将库与设备相关联。
无需编写赋值运算符。
您可能打算在 Library
中制作 lib_func
抽象:
virtual void lib_func() = 0;
题外话:我建议返回 std::unique_ptr
而不是来自工厂的原始指针,这样您就不必记住调用 delete
(您忘记删除 Library
)。没有理由使用 new
分配工厂,您可以在堆栈上创建它。
关于c++ - 如何关联通过抽象工厂创建的不相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915624/