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

C++ 如何初始化抽象基类的受保护成员?,c++,initializer-list,abstract-base-class,C++,Initializer List,Abstract Base Class,也许我什么都不担心。我希望数据成员严格遵循RAII习惯用法。如何将抽象基类中的受保护指针成员初始化为null 我知道它应该是空的,但如果能确保它被普遍理解,那不是更好吗 将初始化代码置于初始值设定项列表之外可能无法运行。考虑到将这个指针分配到堆栈上的汇编操作,它们不能像多线程环境中的c'tor主体那样被中断吗?或者堆栈扩展保证是原子的吗?如果析构函数保证运行,那么即使处理器不以原子方式执行,堆栈扩展也可能没有这样的保证吗 这么简单的问题怎么会变得如此广泛?谢谢 如果我可以避免使用std::lib

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

我知道它应该是空的,但如果能确保它被普遍理解,那不是更好吗

将初始化代码置于初始值设定项列表之外可能无法运行。考虑到将这个指针分配到堆栈上的汇编操作,它们不能像多线程环境中的c'tor主体那样被中断吗?或者堆栈扩展保证是原子的吗?如果析构函数保证运行,那么即使处理器不以原子方式执行,堆栈扩展也可能没有这样的保证吗

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


如果我可以避免使用std::library,那就太好了,我现在处于一个最小的环境中。

非常容易:最好的方法是使用智能指针,真的不要避免使用标准,它通常比您的平均实现做得更好

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)) {}
protected:
    std::unique_ptr<int> a;
    virtual ~base() {} 
};

class child : public base {
     child() : base() {}
     ~child() {} //a will automatically be deleted
};

也许你想得太多了。以下示例将基本成员初始化为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被初始化为零。

也许您考虑得太多了。以下示例将基本成员初始化为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被初始化为零。

还有其他想法吗?我没有可用的std::library。我不知道我的抽象基类中可以有一个c'tor。是的,较低的想法是,抽象类可以而且应该有一个构造函数和析构函数。那会解决你的问题。出于兴趣,你为什么没有std库,什么目标/编译器?@John:只是好奇,你是在为嵌入式系统编写代码吗?为什么环境是最小的?@john您可以访问std库使用它:也就是说您可能没有唯一的ptr,您可以轻松编写自己的ptr或谨慎使用std::auto_ptr。还是比自我管理好。还有其他想法吗?我没有可用的std::library。我不知道我的抽象基类中可以有一个c'tor。是的,较低的想法是,抽象类可以而且应该有一个构造函数和析构函数。那会解决你的问题。出于兴趣,你为什么没有std库,什么目标/编译器?@John:只是好奇,你是在为嵌入式系统编写代码吗?为什么环境是最小的?@john您可以访问std库使用它:也就是说您可能没有唯一的ptr,您可以轻松编写自己的ptr或谨慎使用std::auto_ptr。还是比自我管理好。如果p删除p,只是读得太多;也许是向导生成的代码?@John:我添加了一个更重要的例子。删除应该放在基析构函数中,如base::~base{delete p;}。事实上,永远不要说如果。@John:我认为邪教生成会更合适:-如果p删除p,只是读得太多;也许是向导生成的代码?@John:我添加了一个更重要的例子。删除应该放在基析构函数中,如base::~base{delete p;}。事实上,永远不要说是不是。@John:我认为邪教产生会更合适:-