【发布时间】:2018-07-03 22:39:32
【问题描述】:
考虑一个分配一块要使用的内存块的类:
typedef unsigned char byte;
class ByteBuffer
{
byte* const m_begin; // const pointer, non-const data
byte* const m_end; // const pointer, non-const data
byte* m_pData; // a non-const pointer, e.g. write-head
public:
ByteBuffer(size_t byteBufferSize)
: m_begin(new byte[byteBufferSize],
m_end(m_begin + byteBufferSize),
m_pData(m_begin)
{}
~ByteBuffer() { delete[] m_begin; }
};
如果我想维护代码,最好确保 m_begin 和 m_end 是 const 以确保任何关于容器大小的数学运算都是正确的(并且其他人进来赢了'不会意外更新边缘。但缺点是我无法再在构造函数的初始化列表之外的任何地方初始化数据。
std::bad_alloc 可能很罕见,但我不相信像上面那样调用new[] 是个好主意。所以我的问题是:我们将如何处理希望在类中管理指向内存的 const 指针?
我希望构造函数做类似的事情:
: m_begin(nullptr), m_end(nullptr), m_pData(nullptr)
{
// initialize here
// if initialization is successful, set const & non-const ptrs
}
我是不是想多了?将m_begin 设为const unique_ptr 是否会以某种方式消除所有初始化问题?
【问题讨论】:
-
拥有 const 数据成员的 IMO 麻烦多于其价值;例如该类不能被赋值。
-
在你的最终代码块中,重要的问题是如果初始化不成功,你想做什么?
-
@M.M:说得好。
-
@ilzxc "我想以某种方式渗透错误条件" - 您只需让错误发生并让构造函数的调用者根据需要处理它即可.如您所示,没有理由不使用成员初始化列表。如果您希望构造函数对分配错误做出反应(但不抑制),您可以随时使用 function-try-block。
-
您希望在初始化失败时引发异常。如果您允许使用 nullptr 创建类,那么每次使用这些类之一时,您都必须进行空指针检查并在它们失败时采取措施,这会使您的代码复杂化。
标签: c++ constructor constants