gpt4 book ai didi

c++ - 具有可变返回类型的纯虚函数的功能 - 解决方法/设计?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:59 24 4
gpt4 key购买 nike

我正在开发一个非常非常简单的数据访问层 (DAL),它具有两个类:DataTransferObject (DTO) 和 DataAccessObject (DAO)。这两个类都是抽象基类,需要针对特定​​用例进行继承和修改。

class DataTransferObject {
protected:
//protected constructor to prevent initialization
};

class DataAccessObject {
public:
virtual bool save(DataTransferObject o) = 0;
virtual DataTransferObject* load(int id) = 0;
};

如果是来自业务逻辑层的 House 类,DAL 类的实现将按照以下行读取一些内容:

class Dto_House : public DataTransferObject {
public:
int stories;
string address; //...which are all members of the House class...
Dto_House(House h);
};

class Dao_House : public DataAccessObject {
public:
bool save(Dto_House h) { /*...implement database access, etc...*/ }
Dto_House* load(int id) {/*...implement database access, etc...*/ }
};

编辑:当然,派生类知道 House 类的结构和数据存储。简单,漂亮,okokoke。现在我想在 DTO 类中提供一个方法 toObject() 以便快速将 Dto_House 转换为 House 对象。然后我阅读了 C++14 中的自动返回类型推导并尝试了:

class DataTransferObject {
public:
virtual auto toObject() = 0;
};

但我不得不发现:虚函数没有自动返回类型推导。 :(


对于针对这种特定情况实现“具有推导的返回类型的虚拟函数”,您有什么想法?我想要在我的 DTO“接口(interface)”中使用一个通用的 toObject() 函数".

我唯一想到的是:

template <typename T>
class DataTransferObject {
virtual T toObject() = 0;
};

class Dto_House : public DataTransferObject<House> {
public:
int stories;
string address;
House toObject() {return House(stories, address);}
};

编辑:一个可能的用例是:

House h(3, "231 This Street");
h.doHouseStuff();

//save it
Dto_House dtoSave(h);
Dao_House dao;
dao.save(dtoSave); //even shorter: dao.save(Dto_House(h));

//now load some other house
Dto_House dtoLoad = dao.load(id 2);
h = dtoLoad.toObject();
h.doOtherHouseStuff();

但是房子并不知道它可以保存和加载。

当然,可以派生抽象 DAO 类以进一步细化它以供使用,例如Sqlite、XML 文件或其他...我只是介绍了非常基本的概念。

最佳答案

如何设置一个空的抽象类 - 实际上是一个接口(interface),然后让您的两种类型都实现它并将其设置为 toObject 返回引用类型?

class Transferable 
{
virtual ~Transferable() = 0;
}

然后:

class DataTransferObject {
public:
//Return a reference of the object.
virtual Transferable& toObject() = 0;
};

Dto_House : public DataTransferObject, Transferable { /*...*/ }
House : public DataTransferObject, Transferable { /*...*/ }

上面的例子是为了说明我的观点。更好的是,您可以为此使用 DataTransferObject 作为返回的引用类型,而不是其他抽象类:

class DataTransferObject {
public:
virtual DataTransferObject& toObject() = 0;
};

Dto_House : public DataTransferObject { /*...*/ }
House : public DataTransferObject { /*...*/ }

更新:如果您希望将类分开,按照约定分离数据和操作之间的任何关联,您可以在代表数据的东西上设置基类的名称,即:Building, Construction 等,然后将其用作toObject 中的引用类型。

您还可以让类在数据操作的 API 上操作这些操作。

关于c++ - 具有可变返回类型的纯虚函数的功能 - 解决方法/设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33563301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com