考虑以下情况:
#include <iostream>
using namespace std;
class A {
public:
int y;
A(int &x) {
x = 2;
y = 1;
}
};
class B : public A {
public:
int *p;
B(int t) : A(*p) {}
};
int main() {
B b(2);
return 0;
}
当调用B的构造函数时,p
具有垃圾值。因此,当*p
传递给A()
时,它会给我一个分段错误。我想在调用p = new int;
之前初始化A(*p)
- 这可能吗?
编辑:有趣的是,在没有参数的情况下调用B
的构造函数并没有给出分段错误。
答案 0 :(得分:2)
这样做的方法是引入另一个结构:
class A {
public:
int y;
A(int &x) {
x = 2;
y = 1;
}
};
struct C
{
explicit C(int* p) p(p) {}
int* p;
}
class B : private C, public A {
public:
B(int t) : C(new int), A(*p) {}
~B() {delete p;}
B(const B&) = delete;
B& operator =(const B&) = delete;
};
答案 1 :(得分:1)
我认为这是不可能的,因为在调用B()之前没有分配p。在调用构造函数之前,它不会在initialize-list中被赋值。
<link href="file1.css" rel="stylesheet" />
答案 2 :(得分:1)
如果你发现你处于某种必须做这种奇怪事情的状态,那么就该重新审视一下这个设计。
答案 3 :(得分:-1)
我以另一种方式尝试过。我不知道它是否符合您的要求,或者即使它是否正确。但看看。
topic # both
希望它的正确和有帮助。
注意: - 对我来说,看起来无法在基本初始化列表中传递初始化指针。