我遇到了有线问题,但没有找到解决方法。它看起来像下面这样:
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
的构造函数需要资源的名称,但在初始化之前我无法知道它。我可能有多个实例,因此将其保存为静态也会很复杂。
您可以创建一个
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
进行默认初始化,这会将分配的值替换为不确定的值;更不用说,赋值将是未定义的行为,因为还没有对象可以被 =
修改。