如何初始化抽象基类的受保护成员?

时间:2012-02-26 23:19:12

标签: c++ initializer-list abstract-base-class

也许我一点也不担心。我希望数据成员能够密切关注RAII的习语。如何将抽象基类中的受保护指针成员初始化为null?

我知道它应该是空的,但确保普遍理解它不会更好吗?

将初始化代码放在初始化程序列表之外可能无法运行。考虑到将指针分配到堆栈的汇编操作,它们不能在多线程环境中以相同的方式(如c'tor体)中断或者是否保证堆栈扩展是原子的?如果保证析构函数运行,那么即使处理器没有原子地执行它,堆栈扩展也可能没有这样的保证吗?

这么简单的问题如何变得如此广阔?感谢。

如果我可以避免使用std :: library,那么我就处于极简主义的环境中。

2 个答案:

答案 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初始化为零。