也许我一点也不担心。我希望数据成员能够密切关注RAII的习语。如何将抽象基类中的受保护指针成员初始化为null?
我知道它应该是空的,但确保普遍理解它不会更好吗?
将初始化代码放在初始化程序列表之外可能无法运行。考虑到将指针分配到堆栈的汇编操作,它们不能在多线程环境中以相同的方式(如c'tor体)中断或者是否保证堆栈扩展是原子的?如果保证析构函数运行,那么即使处理器没有原子地执行它,堆栈扩展也可能没有这样的保证吗?
这么简单的问题如何变得如此广阔?感谢。
如果我可以避免使用std :: library,那么我就处于极简主义的环境中。
答案 0 :(得分:3)
非常容易:最好的方法是使用智能指针,实际上不要避免使用标准,它通常比平均实现更好。
class base{
public:
base() : a(new int(5)) {}
protected:
std::unique_ptr<int> a;
virtual ~base() {}
};
class child : public base {
child() : base() {}
~child() {} //a will automatically be deleted
};
现在在这种情况下,除非孩子使用指针(通常不是很好的设计),否则它可以被设为私有。
另一种方法是在基础析构函数中手动删除它
class base{
public:
base() : a(new int(5)) { } //base member init'd
protected:
int* a;
virtual ~base() { delete a; } //base member destroyed
};
答案 1 :(得分:3)
也许你在想这个。以下示例将基本成员初始化为null:
struct Base
{
virtual ~Base() = 0; // or make something else pure; this is just an example
Base() : p() { } // p initialized to null
Base(Foo * q) : p(q) { } // another option
protected:
Foo * p;
};
struct Derived : private Base
{
// no extra work needed
// maybe something like this...
Derived(int a, bool c) : Base(new Foo(a * (c ? 2 : 3))) { }
};
派生构造函数首先调用基础构造函数,然后该构造函数将Base::p
初始化为零。