C ++初始化程序列表成员仍在调用默认构造函数?

达米安·瑞特(Damian Reiter)

我在初始化正在shared_ptr研究的班级成员时遇到问题

我有两节课,AB

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导致AB的构造函数调用的默认构造函数。

大卫·施瓦兹

由于B是从衍生出来的A,所以每个B都是一个A这意味着要构造一个B,还必须构造一个A但是,您不会告诉B构造函数如何构造A,因此将使用默认的构造函数。

如果您想B从中派生A并仅持有shared_ptrto A,则A不得执行您不想做的任何B事情。在这里,A_x_y

目前尚不清楚你真正想要的,但也许你想一些其他的基类,都AB派生从只有两个是什么AB应该有。

C ++中继承的经典示例是Instrument作为Play具有继承类之类的成员的基类,Trumpet并且Clarinet使某些特定乐器成为小号。只有Trumpets和Clarinets的共同点才应该存在Instrument

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++:具有初始化列表的默认构造函数

来自分类Dev

C ++ 11初始化程序列表长度未在隐式构造函数中检查

来自分类Dev

C ++使用其他参数获取构造函数的初始化程序列表

来自分类Dev

C ++:使用RAII解决构造函数初始化程序列表依赖项

来自分类Dev

C ++使用其他参数获取构造函数的初始化程序列表

来自分类Dev

C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

来自分类Dev

错误C2797:成员初始化程序列表中的列表初始化

来自分类Dev

空的C ++ 11初始化程序列表导致容器中包含一个默认的构造对象

来自分类Dev

空的C ++ 11初始化程序列表导致容器中包含一个默认的构造对象

来自分类Dev

c2797成员初始化程序列表中的列表初始化或未实现的非静态数据成员初始化程序

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

C++在初始化类实例时隐式调用类成员的构造函数

来自分类Dev

C ++在构造函数初始化列表中获取类成员地址

来自分类Dev

如何防止警告C4355:“ this”:在基本成员初始化程序列表中使用

来自分类Dev

C ++成员初始化和构造函数

来自分类Dev

c ++构造函数成员初始化:传递参数

来自分类Dev

c ++传递初始化程序列表作为参数来构造对象?

来自分类Dev

C#对象初始化程序-包括构造函数调用括号吗?

来自分类Dev

C ++中的可调用类对象:没有匹配的函数来调用'std :: tuple <T> :: tuple(<括号包围的初始化程序列表>)'

来自分类Dev

复杂分配的C ++构造函数初始化器列表

来自分类Dev

构造函数中的C ++初始化列表

来自分类Dev

C ++ 0x初始化程序列表

来自分类Dev

C ++初始化程序列表重载消除歧义

来自分类Dev

C ++初始化程序列表重载消除歧义

来自分类Dev

c ++ 11初始化程序列表作为数组

来自分类Dev

C ++中的初始化程序列表性能?

来自分类Dev

C ++构造函数:在初始化列表之前初始化局部变量

来自分类Dev

C++ 如何使用隐藏的默认构造函数初始化成员?

Related 相关文章

  1. 1

    C ++:具有初始化列表的默认构造函数

  2. 2

    C ++ 11初始化程序列表长度未在隐式构造函数中检查

  3. 3

    C ++使用其他参数获取构造函数的初始化程序列表

  4. 4

    C ++:使用RAII解决构造函数初始化程序列表依赖项

  5. 5

    C ++使用其他参数获取构造函数的初始化程序列表

  6. 6

    C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

  7. 7

    错误C2797:成员初始化程序列表中的列表初始化

  8. 8

    空的C ++ 11初始化程序列表导致容器中包含一个默认的构造对象

  9. 9

    空的C ++ 11初始化程序列表导致容器中包含一个默认的构造对象

  10. 10

    c2797成员初始化程序列表中的列表初始化或未实现的非静态数据成员初始化程序

  11. 11

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  12. 12

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  13. 13

    C++在初始化类实例时隐式调用类成员的构造函数

  14. 14

    C ++在构造函数初始化列表中获取类成员地址

  15. 15

    如何防止警告C4355:“ this”:在基本成员初始化程序列表中使用

  16. 16

    C ++成员初始化和构造函数

  17. 17

    c ++构造函数成员初始化:传递参数

  18. 18

    c ++传递初始化程序列表作为参数来构造对象?

  19. 19

    C#对象初始化程序-包括构造函数调用括号吗?

  20. 20

    C ++中的可调用类对象:没有匹配的函数来调用'std :: tuple <T> :: tuple(<括号包围的初始化程序列表>)'

  21. 21

    复杂分配的C ++构造函数初始化器列表

  22. 22

    构造函数中的C ++初始化列表

  23. 23

    C ++ 0x初始化程序列表

  24. 24

    C ++初始化程序列表重载消除歧义

  25. 25

    C ++初始化程序列表重载消除歧义

  26. 26

    c ++ 11初始化程序列表作为数组

  27. 27

    C ++中的初始化程序列表性能?

  28. 28

    C ++构造函数:在初始化列表之前初始化局部变量

  29. 29

    C++ 如何使用隐藏的默认构造函数初始化成员?

热门标签

归档