我遇到了一个问题,一个设计问题。这个模板类代表文件处理/驱动程序接口。这是该课程的准系统。
---------------------------- FileDriver.h ---------------- -----------
namespace DatabaseManager {
template<class T>
class FileDriver {
FileDriver(const char *file_name) : file_name(file_name) {}
public :
T* fetch(size_t rec_size, long rec_num, long offset , bool write_enabled) {
// fetch data from file
}
int insert(T *rec, size_t rec_size, long rec_num, long offset) {
// insert data into file
}
inline int release(T *rec, size_t rec_size, int rec_num) {
// close the file
}
};
}
现在,该类由系统中需要I / O操作的任何类使用。但作为一个模板类,所以每次我需要访问一个文件时我都要创建这个类的对象。例如,以下是函数如何使用此类。
---------------------- ParseSparseParticles.cpp ------------------
#include "FileDriver.h"
bool ParseSparseParticles::openFile() throw(ParseSparseParticlesException)
{
// DatabaseManager::FileMetaInfo is a struct containing meta information about a file
DatabaseManager::FileMetaInfo *meta_info = nullptr;
DatabaseManager::SparseParticles *particle_data = nullptr;
DatabaseManager::FileDriver<DatabaseManager::FileMetaInfo> meta_hndlr(meta_file_name.str().c_str());
meta_info = meta_hndlr.fetch(sizeof(DatabaseManager::FileMetaInfo), 1, static_cast<int>(DatabaseManager::file_map_pos::START), false);
if (meta_info) {
DatabaseManager::FileDriver<DatabaseManager::SparseParticles> data_hndlr(file_name.str().c_str());
particle_data = data_hndlr.fetch(sizeof(DatabaseManager::SparseParticles),
meta_info->num_rec, static_cast<int>(DatabaseManager::file_map_pos::START), false);
if (particle_data) {
data_hndlr.release(particle_data, sizeof(DatabaseManager::SparseParticles), meta_info->num_rec);
meta_hndlr.release(meta_info, sizeof(DatabaseManager::FileMetaInfo), 1);
return true;
} else {
throw ParseSparseParticlesException("Cannot open Sparse Particles File");
}
} else {
throw ParseSparseParticlesException("Cannot open Meta Info File");
}
}
所以我每次需要访问任何文件时都必须遵循这个完全相同的步骤。 1.打开元信息文件 2.打开实际的数据文件 3.关闭数据文件 4.关闭元文件
这会在一段时间后变得令人厌烦,更糟糕的是它导致重复的代码,非结构化的代码,因为文件操作在整个系统中完成。所以我在考虑创建一个抽象I / O操作的接口。在这样做的过程中我偶然发现我想创建接口类的FileDriver成员对象,就像这样
--------------------------- IOInterface.h ---------------------------
#include "FileDriver.h"
template<typename MetaFileType, typename FileType>
class IOInterface {
DatabaseManager::FileDriver<MetaFileType> meta_orb; // won't compile
DatabaseManager::FileDriver<FileType> data_orb; // won't compile
};
但是这不会编译,因为我将模板头包含在另一个模板头中。所以可以请任何人告诉我如何解决这个问题。我怎样才能创建一个类似于FileDriver接口的类,只要该类对象处于活动状态,它就会存储FileDriver对象。
由于
更新
编译时遇到的错误是使用IOInterface构造函数。
IOInterface::IOInterface(std::string data_dir, std::string file_prefix, int id) :
data_dir(data_dir),
file_prefix(file_prefix),
file_id(id)
{}
/var/local/PolymerizationSimulation/include/IOInterface.h:7: error: no matching function for call to 'DatabaseManager::FileDriver<DatabaseManager::MetaFileType>::FileDriver()'
/var/local/PolymerizationSimulation/include/IOInterface.h:7: error: no matching function for call to 'DatabaseManager::FileDriver<DatabaseManager::FileType>::FileDriver()'
答案 0 :(得分:0)
查看代码时的一些提示:
课后定义你错过了分号:
};
^
同样来自您的示例,FileDriver不在DatabaseManager中
在这堂课中:
template<class T>
class FileDriver {
所有成员都是私有的,甚至是构造函数,因此您无法访问它。最后,这个类不提供以下所需的默认构造函数:
DatabaseManager::FileDriver<MetaFileType> meta_orb; // won't compile
DatabaseManager::FileDriver<FileType> data_orb; // won't compile
所以编译器不知道如何创建这些实例,为FileDriver添加它:
FileDriver(){}