Rumah > Soal Jawab > teks badan
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})
}
黄舟2017-05-16 13:27:27
Digalakkan guna std::vector<int>
,构造函数接受const std::vector<int> &arr
,拷贝用this->o = arr
.
習慣沉默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])
Templat:🎜 🎜 🎜🎜
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;
}