继承:构造函数,初始化C++11中基类的类C数组成员
Inheritance: constructor, initialize C like array member of base class in c++11
考虑以下代码:
struct Base //in my real scenario Base class can not be changed
{
int a;
double b[10];
};
struct Child : Base
{
Child(int aa, double bb[10]) : Base{aa} {} //This works fine
Child(int aa, double bb[10]) : Base{aa, bb} {} //this is not working
};
child的第二个构造函数不起作用。我得到错误"数组必须用大括号括起来的初始值设定项初始化"。如何在不更改基类的情况下在Child
中初始化b
(例如,使用向量而不是类c数组,我不允许这样做(
在Child
的构造函数中,bb
不是一个数组:由于衰减,它只是一个指针。并且不能用指针初始化数组(Base
中的b
(。
在两个类中使用std::array
而不是原始数组将解决您的问题:
struct Base
{
int a;
std::array<double, 10> b;
};
struct Child : Base
{
Child(int aa, std::array<double, 10> bb) : Base{aa, bb} {}
};
然而,由于您提到Base
不能修改,您将不得不手动复制元素(在一般情况下,您也可以移动它们,尽管基本类型没有意义(:
#include <array>
#include <algorithm>
#include <iostream>
struct Base {
int a;
double b[10];
};
struct Child : Base {
Child(int aa, std::array<double, 10> bb) : Base{aa} {
std::copy(bb.begin(), bb.end(), b);
}
};
int main() {
auto child = Child(3, {2, 3, 4});
for (auto it : child.b) {
std::cout << it << " ";
}
}
在Coliru 上直播
您也可以使用引用来代替std::array
,但语法有点复杂:
Child(int aa, double const (&bb)[10]) : Base{aa} {
std::copy(&bb[0], &bb[10], b);
}
相关文章:
- 为什么我无法访问指向数组中成员函数的指针?
- 如何将结构/联合数组的成员传递到函数中
- 使用带有参数包的数组的成员数组初始化类
- 有没有办法给数组的成员指定不同的名称?
- 使用包含结构的数组的成员函数
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- C 用数组作为成员创建对象
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 来自数组的成员和比特菲尔德的结构
- 如何创建指向数组类成员的指针?
- 将数组的成员设置为零
- "Empty"数组\向量成员 C++
- 功能指针数组(包括成员功能)投掷模板专业化错误
- 另一个结构内部的结构数组的成员变量没有通过引用传递
- 正确转换 2D 数组的成员变量
- 常量数组类成员初始化
- 为具有对象或对象数组作为成员的类运行不同的代码
- C++ 如何指向数组的成员
- 将包含数组数据成员的结构保存到文件
- 数组类成员初始化(C++)