【发布时间】:2020-11-16 09:50:26
【问题描述】:
我在初始化我正在处理的类的 shared_ptr 成员时遇到问题。
我有两个班级,A 和 B:
class A {
int _x;
int _y;
public:
A(int, int);
};
A::A(int x, int y) {
_x = x;
_y = y;
}
class B : public A {
std::shared_ptr<A> _a;
public:
B(std::shared_ptr<A>);
};
B::B(std::shared_ptr<A> a) : _a(a) {}
int main() {
std::shared_ptr<A> a = std::make_shared<A>(1, 2);
B b(a);
return 0;
}
我只想让B 类将std::shared_ptr 保存到A 类的实例中。
但是,我在B 的构造函数中收到错误no matching function for call to A::A()。
我很困惑,因为我认为初始化列表的目的是避免隐式调用成员变量的默认构造函数,但它似乎仍在尝试调用 A 的默认构造函数。
感谢任何解释。
编辑:经过更多的混乱,如果B 没有从A 继承,它似乎可以正确遵守。仍然不确定为什么从A 继承会导致A 的默认构造函数被B 的构造函数调用。
【问题讨论】:
-
A的默认构造函数在B的构造函数中被隐式调用:B::B(std::shared_ptr<A> a) : _a(a) {}。因为B继承自A,所以在构造B时必须调用A的构造函数。 -
为什么要
B从A继承并且同时拥有shared_ptr到A? -
当你从一个类继承时,新类的每个对象都包含一个超类的对象。
class B : A表示每个B包含一个A。您需要以某种方式初始化该对象。如果你不在成员初始化列表中初始化它(你不是),那么它默认使用不存在的默认构造函数。因此B必须被拒绝。 -
如果你只是想让
B持有shared_ptr到A,为什么B派生自A,这使得它不仅仅持有shared_ptr? -
@LouisGo 这就是 OP 已经发现的:
it seems like it complies properly if B does not inherit from A
标签: c++ initialization shared-ptr initializer-list