指针 - C++ 初始化列表中数组如何传递?

【字号: 日期:2023-03-20浏览:16作者:雯心

问题描述

如题,下方代码中 X 和 Y 可以正常构造, A 和 B 报错 [Error] incompatible types in assignment of ’const int’ to ’int []’ 。

请问如上情况,如何把数组在初始化列表中传递。从而实现

A a1({1}); A a2({1, 2}); A a3({1, 2, 3})

这样以 任意大小的数组 对成员变量初始化。

#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})}

问题解答

回答1:

建议用std::vector<int>,构造函数接受const std::vector<int> &arr,拷贝用this->o = arr即可。

回答2:

这个问题可以转化成:哪些形参形式可以传递初始化列表?

非模板:

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才可以,但是有些编译器已经支持了。

代码样例,另含几种常见的不可以的情况。

初始化数组成员变量:似乎没有比较简单的办法在初始化列表里初始化数组成员。建议在构造函数的函数体内赋值。不过可以用模板实现:

#include <cstddef>#include <utility>class A { public: template <class... Args> A(Args... args) : x_{args...} {} virtual void foo() {} // 阻止aggregate initialization private: int x_[4];};template <class T, class U, size_t... ints>A FactoryImpl(const T &list, std::integer_sequence<U, ints...>) { return {list[ints]...};}template <class T, size_t N>auto Factory(const T (&arr)[N]) { return FactoryImpl(arr, std::make_index_sequence<N>());}int main(){ A x = {1,2,3,4}; A y = Factory({1,2,3,4}); return 0;}

相关文章: