As shown in the title, X and Y in the code below can be constructed normally, but A and B report errors[Error] incompatible types in assignment of 'const int' to 'int []' .
Please tell me how to pass the array in the initialization list in the above situation.
in order to fulfill
A a1({1});
A a2({1, 2});
A a3({1, 2, 3})
In this way, member variables are initialized with an array of any size.
#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})
}
It is recommended to use
std::vector<int>
,构造函数接受const std::vector<int> &arr
,拷贝用this->o = arr
.This question can be transformed into: Which formal parameter forms can pass the initialization list?
Non-template:
void foo(T), void foo(const T &)
,当T可以用初始化列表拷贝初始化时。即初始化T x = {...};
Legal.void foo(std::initializer_list<T>)
Template:
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])
, this is said to be only available in C++17, but some compilers already support it.Code sample, including several common situations where it is not possible.
Initialize array member variables: There seems to be no simple way to initialize array members in the initialization list. It is recommended to assign values within the function body of the constructor. But it can be achieved using templates: