两个没有默认构造函数的相互依赖的成员函数
Two interdependent member functions with no default constructor
我确信这个问题必须在某处得到回答,但我无法提出问题...
我的问题是我有两个对象(foo
、bar
),其中 bar
需要使用 foo
实例进行初始化。当两个对象都是另一个 class (baz
) 的数据成员时,该怎么做?
我无法在 baz
构造函数主体中初始化 bar
,因为此时 bar
必须已经使用缺少的默认构造函数进行了初始化。
我无法在 baz
初始化列表中初始化 bar
,因为此时 foo
尚未构建。当心编译器不关心!
看例子:
#include <iostream>
#include <memory>
using namespace std;
class foo
{
public:
foo() {
cout << "foo constructor called." << endl;
}
private:
};
class bar
{
public:
bar(foo inFoo) : mFoo(inFoo) {
cout << "bar constructor called." << endl;
}
private:
foo mFoo;
};
class baz
{
public:
baz() : mBar(mFoo) {
cout << "baz constructor called." << endl;
} // ERROR: mFoo is not inizilized
private:
bar mBar;
foo mFoo;
};
int main()
{
baz Baz;
}
我想到的唯一解决方法是在 baz
class 中使用指针。使用 bar
数据成员的指针允许我将初始化推迟到 baz
构造函数主体。
class baz
{
public:
baz() {
cout << "baz constructor called." << endl;
mBar = unique_ptr<bar>( new bar(mFoo) );
}
private:
unique_ptr<bar> mBar;
foo mFoo;
};
但是没有指针是否可以解决这个问题?
由于 mBar
依赖于 mFoo
,只需重新排序声明:
private:
foo mFoo;
bar mBar;
并先初始化mFoo
:
baz() : mFoo(), mBar(mFoo) {
// ...
}
这里是 demo。
我确信这个问题必须在某处得到回答,但我无法提出问题...
我的问题是我有两个对象(foo
、bar
),其中 bar
需要使用 foo
实例进行初始化。当两个对象都是另一个 class (baz
) 的数据成员时,该怎么做?
我无法在 baz
构造函数主体中初始化 bar
,因为此时 bar
必须已经使用缺少的默认构造函数进行了初始化。
我无法在 baz
初始化列表中初始化 bar
,因为此时 foo
尚未构建。当心编译器不关心!
看例子:
#include <iostream>
#include <memory>
using namespace std;
class foo
{
public:
foo() {
cout << "foo constructor called." << endl;
}
private:
};
class bar
{
public:
bar(foo inFoo) : mFoo(inFoo) {
cout << "bar constructor called." << endl;
}
private:
foo mFoo;
};
class baz
{
public:
baz() : mBar(mFoo) {
cout << "baz constructor called." << endl;
} // ERROR: mFoo is not inizilized
private:
bar mBar;
foo mFoo;
};
int main()
{
baz Baz;
}
我想到的唯一解决方法是在 baz
class 中使用指针。使用 bar
数据成员的指针允许我将初始化推迟到 baz
构造函数主体。
class baz
{
public:
baz() {
cout << "baz constructor called." << endl;
mBar = unique_ptr<bar>( new bar(mFoo) );
}
private:
unique_ptr<bar> mBar;
foo mFoo;
};
但是没有指针是否可以解决这个问题?
由于 mBar
依赖于 mFoo
,只需重新排序声明:
private:
foo mFoo;
bar mBar;
并先初始化mFoo
:
baz() : mFoo(), mBar(mFoo) {
// ...
}
这里是 demo。