gpt4 book ai didi

c++ - 面向对象的编程概念和资源管理

转载 作者:行者123 更新时间:2023-11-30 04:32:40 28 4
gpt4 key购买 nike

所以我有一个 FileReader类,它看起来像这样:

#define DISALLOW_COPY(type) \
type(const type&); \
void operator=(const type&)

class FileReader {
FILE *file;
DISALLOW_COPY(FileReader);
protected:
unsigned char *data;
long size;
public:
FileReader(const char *filename);
~FileReader();
unsigned long getSize();
unsigned char *getFileData();
};


FileReader::FileReader(const char *filename) {

file = NULL; data = NULL;
if (!(file = fopen(filename, "rb"))) { throw std::runtime_error("File could not be opened."); }
fseek(file,0,SEEK_END);
size = ftell(file);
rewind(file);
data = new unsigned char [size];
VERIFY(size == (long)fread(data, 1, size, file));
fclose(file);
#ifdef DEBUG
PRINT("FileReader opening file "); printf("%s, %ld bytes.\n",filename,size);
#endif
}
FileReader::~FileReader() {
delete[] data;
}
unsigned char *FileReader::getFileData() { return data; }
unsigned long FileReader::getSize() { return size; }

它本身运行良好。

当我创建 FileReader我必须使用一个文件名来指定它必须打开的文件,当我完成它时,它会自动清理。

但我发现我在充分利用这个类(class)时遇到了一些麻烦。你看,如果我尝试从另一个类使用它,例如 Image表示光栅图像的类,我不是总是创建 Image通过从文件中读取它。所以,我不想继承 FileReader来自 Image .

我也做不到FileReader Image的成员,因为我在初始化 Image 时仍然需要初始化(并读出文件) .

然而,我能做的是使用 FileReader路过Image::loadFile() ,但是我必须分配一个新缓冲区来存储所有数据,因为 FileReader将在函数调用结束时清理。

起初我认为 RAII 是个好主意,但现在我不太确定了。它非常适合处理异常,但我想避免像这样移动我的数据,同时保持一个干净的界面,这将有助于防止内存管理噩梦。有没有办法做到这一点?在我看来,我必须对事物进行重大重组,以避免在一系列动态分配的缓冲区中处理所有数据。我应该使用智能指针吗?

最佳答案

RAII 一个好主意。您需要拆分文件和“打开文件”对象。创建一个名为 OpenFile 的新类,其构造函数如下所示 OpenFile(FileReader &f);您的资源是一个打开的文件,而不是文件名。

关于c++ - 面向对象的编程概念和资源管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7476620/

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