1

也许我什么都不担心。我希望数据成员严格遵循 RAII 习语。如何将抽象基类中的受保护指针成员初始化为空?

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

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

这么简单的问题怎么会变得如此广泛?谢谢。

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

4

2 回答 2

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
};
于 2012-02-26T23:23:53.770 回答
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被初始化为零。

于 2012-02-26T23:28:15.657 回答