我在初始化正在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
持有classstd::shared_ptr
的实例A
。但是,我no matching function for call to A::A()
在B
的构造函数中遇到了错误。
我很困惑,因为我认为初始化列表的目的是避免隐式调用成员变量的默认构造函数,但是它似乎仍在尝试调用A
默认构造函数。
任何解释表示赞赏,谢谢。
编辑:经过更多的混乱之后,如果B
不继承自,则似乎正确合规A
。仍不确定为什么从继承会A
导致A
从B
的构造函数调用的默认构造函数。
由于B
是从衍生出来的A
,所以每个B
都是一个A
。这意味着要构造一个B
,还必须构造一个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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句