c++ - 如何关联通过抽象工厂创建的不相关对象

标签 c++ design-patterns

目前我正在研究一个处于初始阶段的设计,下面是我到目前为止所做的一些作业,但它似乎不太好,我一直面临着一些问题。从下面的代码可以清楚地看出,设备工厂已用于设备对象和库对象的创建目的。 现在的工作是从工厂获取设备对象后,将调用连接函数,这将确保连接成功完成,现在任何相关的解析器(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/

相关文章:

c++ - 如何在 Qt 应用程序中处理纯正则表达式结果?

C++通过多个函数传递模板参数

c# - Dispose(bool) 中的 disposed 标志到底是什么意思?

design-patterns - 装饰者设计模式和访问者设计模式的区别

asp.net-mvc - MVC Web 应用程序应该是 3 层吗?

c++ - Xcode 中 wxWidgets 项目中的 undefined symbol

c++ - 创建目录并导航到目录 c++

c++ - 在 C++11 之前的 C++ 中实现 Double Check Lock Pattern 安全吗

设计模式

android - Android-Binding 和 Roboguice 怎么样?