c++ - C++ 初始值设定项列表成员仍在调用默认构造函数?
问题描述
我在初始化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;
}
我只想让 classB
持有一个std::shared_ptr
class 的实例A
。但是,我no matching function for call to A::A()
在B
的构造函数中遇到了错误。
我很困惑,因为我认为初始化列表的重点是避免隐式调用成员变量的默认构造函数,但它似乎仍然试图调用A
的默认构造函数。
任何解释表示赞赏,谢谢。
编辑:经过更多的混乱,如果B
不继承自A
. 仍然不确定为什么继承 fromA
会导致A
从 ' 的构造函数中调用 ' 的默认构造B
函数。
解决方案
既然B
是从 派生的A
,那么每一个B
都是一个A
。这意味着要构造 a B
,您还必须构造 a A
。但是,您不告诉B
' 构造函数如何构造A
,因此使用默认构造函数。
如果你想B
从A
并且只持有一个shared_ptr
to A
,那么A
一定不要做任何你不想B
做的事情。在这里,A
有_x
和_y
。
目前尚不清楚你真正想要什么,但也许你想要一些其他的基类,它们都A
和B
从它派生的只有两者A
和B
应该有的东西。
C++ 中继承的经典示例就像Instrument
是基类,其成员Play
与派生类类似Trumpet
,并且Clarinet
具有使某些特定工具成为小号的东西。只有Trumpet
s 和Clarinet
s 共有的内容才应该在Instrument
.
推荐阅读
- java - Spring中的Around Annotation
- swift - 了解可逃避的闭包
- server - 如何设置 JetBrains YouTrack 以在带有 IIS 服务器的 Windows 8 LAN 上工作
- deep-learning - yoloV3 重新计算锚点
- jquery - 无法从 json 文件中提取不同的数组名称
- typescript - TS 获取变量类型
- javascript - 如何手动创建和打开引导下拉菜单?
- php - JSON回复包含额外的数组?
- python - Plotly:如何根据周期绘制时间图?
- tensorflow - 采样的 softmax 损失评估代码有效,但函数调用导致 ValueError