在构造函数运行之前分配成员

问题描述 投票:0回答:1

我遇到了有线问题,但没有找到解决方法。它看起来像下面这样:

class MyClass : public BaseClass {
public:
    MyClass() : BaseClass(initializeResource())
    { }

    ~MyClass() {
        delete m_resource;
    }

private:
    Resource *m_resource;
    string initializeResource() {
        m_resource = (*resource initialization here*);
        return m_resource.name();
    }
}

因此

initializeResource()
在构造函数运行之前运行,因此在所有成员初始化之前运行。这必须是这样,因为它的结果被赋予了基本构造函数。我还必须在其中保存基类中不可用的信息。

这是可行的,因为首先分配内存,并且在构造函数初始化时原始指针不会被覆盖。但它对我来说看起来很可疑,我想问这是否仍然会出错。

要提前提出一些建议: 封装可以解决这个问题,但我需要在这里进行推导,因为有些变量可能是

BaseClass
MyClass
类型。
m_resource
是系统资源,我需要存储它并删除它。
BaseClass
的构造函数需要资源的名称,但在初始化之前我无法知道它。我可能有多个实例,因此将其保存为静态也会很复杂。

c++ constructor raw-pointer initialization-order
1个回答
0
投票

您可以创建一个

private
辅助构造函数:

private:
    MyClass(Resource* resource)
      : BaseClass(resource->name())
      , m_resource(resource)
    { }

public:
    MyClass() : MyClass(/* resource initialization here or in a static member function */)
    { }

这样,资源初始化仍然首先发生,并且您不需要在初始化之前分配

m_resource

我相信您的原始代码是不正确的,因为赋值

m_resource = ...
之后将由构造函数对
m_resource
进行默认初始化,这会将分配的值替换为不确定的值;更不用说,赋值将是未定义的行为,因为还没有对象可以被
=
修改。

© www.soinside.com 2019 - 2024. All rights reserved.