Wie bereits erwähnt, können X und Y im folgenden Code normal konstruiert werden, aber A und B melden Fehler [Fehler] inkompatible Typen bei der Zuweisung von 'const int' zu 'int []' .
Bitte sagen Sie mir, wie das Array in der obigen Situation in der Initialisierungsliste übergeben werden soll.
Somit erreicht
A a1({1});
A a2({1, 2});
A a3({1, 2, 3})
Auf diese Weise werden Mitgliedsvariablen mit einem Array beliebiger Größe initialisiert.
#include <iostream>
using namespace std;
class A {
public:
A(const int*);
protected:
int o[4];
};
class B : public A {
public:
B(int, int);
};
class X {
public:
X(int, int);
protected:
int o[4];
};
class Y : public X {
public:
Y(int, int);
};
A::A(const int *p) : o(p){};
B::B(int p0, int p1) : A({p0, p1}){};
X::X(int p0, int p1) : o({p0, p1}){};
Y::Y(int p0, int p1) : X(p0, p1){};
int main() {
A a({1, 2});
B b(3, 4);
X x(5, 6);
Y y(7, 8);
// A a1({1});
// A a2({1, 2});
// A a3({1, 2, 3})
}
建议用
std::vector<int>
,构造函数接受const std::vector<int> &arr
,拷贝用this->o = arr
即可。这个问题可以转化成:哪些形参形式可以传递初始化列表?
非模板:
void foo(T), void foo(const T &)
,当T可以用初始化列表拷贝初始化时。即初始化T x = {...};
合法。void foo(std::initializer_list<T>)
模板:
template <class T> void foo(std::initializer_list<T>)
template <size_t N> void foo(const T (&)[N])
template <class T, size_t N> void foo(const T (&)[N])
,这个说是C++17才可以,但是有些编译器已经支持了。代码样例,另含几种常见的不可以的情况。
初始化数组成员变量:似乎没有比较简单的办法在初始化列表里初始化数组成员。建议在构造函数的函数体内赋值。不过可以用模板实现: