Pointeur - Comment passer un tableau dans la liste d'initialisation C++ ?
巴扎黑
巴扎黑 2017-05-16 13:25:27
0
2
740

Comme mentionné, dans le code ci-dessous, X et Y peuvent être construits normalement, mais A et B signalent des erreurs [Erreur] types incompatibles dans l'affectation de 'const int' à 'int []' .

Veuillez me dire comment transmettre le tableau dans la liste d'initialisation dans la situation ci-dessus.
Ainsi réalisé

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

De cette façon, les variables membres sont initialisées avec un tableau de n'importe quelle taille.

#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})
}
巴扎黑
巴扎黑

répondre à tous(2)
黄舟

Il est recommandé d'utiliser std::vector<int>,构造函数接受const std::vector<int> &arr,拷贝用this->o = arr.

習慣沉默

Cette question peut être transformée en : Quelles formes de paramètres formels peuvent passer la liste d'initialisation ?

Non modèle :

  • void foo(T), void foo(const T &), lorsque T peut être initialisé en copiant la liste d'initialisation. Autrement dit, l'initialisation T x = {...}; est légale. 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])

void foo(std::initializer_list<T>)

Modèle :🎜 🎜 🎜🎜modèle <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]), on dit que cela n'est disponible qu'en C++ 17, mais certains compilateurs le prennent déjà en charge . 🎜🎜 🎜 🎜Exemple de code, comprenant plusieurs situations courantes où cela n'est pas possible. 🎜 🎜Initialiser les variables membres du tableau : il ne semble pas y avoir de moyen simple d'initialiser les membres du tableau dans la liste d'initialisation. Il est recommandé d'attribuer des valeurs dans le corps de la fonction du constructeur. Mais cela peut être réalisé à l'aide de modèles : 🎜
#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;
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal