将此视为您不想使用的智力练习std::vector
,您需要将班级划分为单一职责。这是我的“整数数组”类。它的职责是管理整数数组的内存。
class IntArray {
public:
IntArray() : ptr_(new int[100]) {}
~IntArray() { delete[] ptr_; }
IntArray(const IntArray&) = delete; // making copyable == exercise for reader
IntArray& operator=(const IntArray&) = delete;
// TODO: accessor?
private:
int* ptr_;
};
这是我的文件处理类。它的职责是管理一个FILE*
.
class FileHandle {
public:
FileHandle(const char* name, const char* mode)
: fp_(fopen(name, mode))
{
if (fp_ == 0)
throw std::runtime_error("Failed to open file");
}
~FileHandle() {
fclose(fp_); // squelch errors
}
FileHandle(const FileHandle&) = delete;
FileHandle& operator=(const FileHandle&) = delete;
// TODO: accessor?
private:
FILE* fp_;
};
请注意,我将构造错误转换为异常;fp_
作为一个有效的文件指针是我希望维护的不变量,因此如果我无法设置此不变量,我将中止构造。
现在,File_ptr
使异常安全变得容易,并且类不需要复杂的资源管理。
class File_ptr {
private:
FileHandle p;
IntArray i;
public:
File_ptr(const char* n, const char* s)
: p(n, s)
, i()
{}
};
请注意缺少任何用户声明的析构函数、复制赋值运算符或复制构造函数。我可以交换成员的顺序,无论哪种情况,抛出哪个构造函数都无关紧要。