Rumah  >  Soal Jawab  >  teks badan

Penunjuk - Bagaimana untuk menghantar tatasusunan dalam senarai permulaan C++?

Seperti yang dinyatakan, dalam kod di bawah, X dan Y boleh dibina secara normal, tetapi A dan B melaporkan ralat [Error] jenis tidak serasi dalam penugasan 'const int' kepada 'int []' .

Sila beritahu saya cara menghantar tatasusunan dalam senarai permulaan dalam situasi di atas.
Sehingga tercapai

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

Dengan cara ini, pembolehubah ahli dimulakan dengan tatasusunan sebarang saiz.

#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})
}
巴扎黑巴扎黑2686 hari yang lalu649

membalas semua(2)saya akan balas

  • 黄舟

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

    Digalakkan guna std::vector<int>,构造函数接受const std::vector<int> &arr,拷贝用this->o = arr.

    balas
    0
  • 習慣沉默

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

    Soalan ini boleh diubah menjadi: Borang parameter formal manakah yang boleh melepasi senarai permulaan?

    Bukan templat:

    • void foo(T), void foo(const T &), apabila T boleh dimulakan dengan menyalin senarai permulaan. Iaitu, permulaan T x = {...}; adalah sah. 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>)

    Templat:🎜 🎜 🎜🎜templat <kelas T> void foo(std::initializer_list<T>)🎜🎜 🎜🎜templat <saiz_t N> void foo(const T (&)[N])🎜🎜 🎜🎜template <class T, size_t N> void foo(const T (&)[N]), ini dikatakan hanya tersedia dalam C++17, tetapi beberapa penyusun sudah menyokongnya . 🎜🎜 🎜 🎜Sampel kod, termasuk beberapa situasi biasa yang tidak mungkin. 🎜 🎜Memulakan pembolehubah ahli tatasusunan: Nampaknya tiada cara mudah untuk memulakan ahli tatasusunan dalam senarai permulaan. Adalah disyorkan untuk menetapkan nilai dalam badan fungsi pembina. Tetapi ia boleh dicapai menggunakan templat: 🎜
    #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;
    }

    balas
    0
  • Batalbalas