Maison  >  Questions et réponses  >  le corps du texte

Pointeur - Comment passer un tableau dans la liste d'initialisation C++ ?

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})
}
巴扎黑巴扎黑2736 Il y a quelques jours707

répondre à tous(2)je répondrai

  • 黄舟

    黄舟2017-05-16 13:27:27

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

    répondre
    0
  • 習慣沉默

    習慣沉默2017-05-16 13:27:27

    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;
    }

    répondre
    0
  • Annulerrépondre