【问题标题】:How to initalize a vector inherited from base class in derived constructor如何在派生构造函数中初始化从基类继承的向量
【发布时间】:2019-10-01 09:19:44
【问题描述】:

我知道我可以像这样在派生中初始化基类的向量:

Base.h

#include <vector>
#include <utility>

public:
  Base(std::vector<std::pair<int, int> > vec);
  ~Base();
private:
  std::vector<std::pair<int, int> > vec_;

Base.cpp

Base::Base(std::vector<std::pair<int, int> > vec) : vec_(vec)
{
}

Derived.cpp

Dervied::Derived : Base({{0, 0}, {1, 1}})
{
}

但是有没有办法在child中初始化这个基类的向量vec_呢?

Base.h

#include <vector>
#include <utility>

public:
  Base();
  ~Base();
private:
  std::vector<std::pair<int, int> > vec_;

Base.cpp

Base::Base()
{
}

比如:

Derived::Derived : Base(vec_({{0, 0}, {1, 1}}))

或者这在 C++ 中根本不可能?

【问题讨论】:

  • 顺便说一句:1. 盲目地将每个类放入自己的文件中是对模块化准则的过度广泛的错误应用。 2. minimal reproducible example 应该包含尽可能多的文件来证明这一点,而不是更多。
  • 你期望Derived::Derived() : Base(vec_({{0, 0}, {1, 1}})) {} - 如果它是有效的,它不是 - 实现Derived::Derived() : Base({{0, 0}, {1, 1}}) {} 没有实现?您的目标似乎是初始化 Basevec_ 成员 - 但基类构造函数会这样做。请记住,构造基类会初始化具有适当构造函数的基类的所有成员 - 因此选择正确的构造函数是根据需要初始化成员的方法。
  • 我只想在每个派生类中用不同的值初始化向量。

标签: c++ inheritance constructor initialization access-control


【解决方案1】:

vec_private。因此,它在派生类中不可访问。如果您需要在派生类中访问它,可以将其设为protected

由于您的类目前处于状态,您只能通过基类构造函数修改vec_

如果派生类可以访问其他一些基类方法来修改vec_,那么您可以使用它们来更改vec_

【讨论】:

  • 谢谢,所以唯一的方法是要么保护它,要么使用基类的构造函数,如 Base(std::vector<:pair int>> vec);然后在派生中像这样初始化它: Derved::Derived : Base({{0, 0}, {1, 1}}) ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2023-03-31
  • 2017-08-30
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多