在下面的代码中,我遇到了问题。它表现为bad_alloc异常,这是因为传递给reader
的参数CompressedBufferReader
是一个错误的字符串。从构造函数调用构造函数
class FileReader {
FILE *file;
protected:
unsigned char *data; // local copy
long size;
public:
FileReader(const char *filename);
~FileReader();
unsigned long getSize();
unsigned char *getFileData();
};
class CompressedBufferReader {
unsigned char *buffer;
unsigned long len;
public:
CompressedBufferReader(unsigned char *);
~CompressedBufferReader();
unsigned char *getBuffer();
unsigned long getLength();
};
CompressedBufferReader::CompressedBufferReader(unsigned char *srcCompressed) {
len = 0; buffer = 0;
len = GetDecompressedBufferSize(srcCompressed);
buffer = new unsigned char[len]; if (!buffer) throw std::runtime_error("Cannot allocate!");
WriteDecompressedBuffer(buffer, len, srcCompressed);
}
CompressedBufferReader::~CompressedBufferReader() {
delete[] buffer;
}
unsigned char *CompressedBufferReader::getBuffer() {return buffer;}
unsigned long CompressedBufferReader::getLength() {return len;}
// similar interface to FileReader. Does not inherit because it does not benefit from doing so.
class CompressedFileReader {
CompressedBufferReader reader;
public:
CompressedFileReader(const char *filename);
unsigned char *getFileData();
unsigned long getSize();
};
CompressedFileReader::CompressedFileReader(const char *filename) : reader(FileReader(filename).getFileData()){} // this line is causing the problem
unsigned char *CompressedFileReader::getFileData() { return reader.getBuffer(); }
unsigned long CompressedFileReader::getSize() { return reader.getLength(); }
更具体地讲,好像我创建匿名其数据内容可被传递到reader
构造变得之前释放的的FileReader,一个CompressedBufferReader
。
的问题是,我不能写CompressedFileReader
的构造函数的方式,让我正确实例化一个FileReader
,因为我打算用CompressedBufferReader
的构造,这意味着构造函数的身体之前,我必须调用它。一个catch-22的位。这个问题如何解决?
我觉得很难说没有看到'FileReader'的实现是什么问题。但是作为一般性评论,您的代码非常“手动”,如果您使用标准容器和字符串,读取和维护可能会更加简单。 –