class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Saya yakin alasannya adalah bahwa array hanya dapat diinisialisasi dengan =
sintaks, yaitu:
int arr[3] = {1,3,4};
Pertanyaan
- Bagaimana saya bisa melakukan apa yang ingin saya lakukan (yaitu, menginisialisasi array dalam konstruktor (tidak menugaskan elemen dalam tubuh)). Apakah itu mungkin?
- Apakah standar C ++ 03 mengatakan sesuatu yang khusus tentang menginisialisasi agregat (termasuk array) di penginisialisasi ctor? Atau ketidakabsahan kode di atas adalah akibat wajar dari beberapa aturan lain?
- Apakah daftar penginisialisasi C ++ 0x menyelesaikan masalah?
PS Harap tidak menyebutkan vektor, boost :: array, dan keunggulannya terhadap array, yang sangat saya sadari.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Armen Tsirunyan
sumber
sumber
Jawaban:
Iya. Ini menggunakan struct yang berisi array. Anda bilang Anda sudah tahu tentang itu, tapi kemudian saya tidak mengerti pertanyaannya. Dengan cara itu, Anda melakukan inisialisasi array di konstruktor, tanpa tugas di badan. Inilah yang
boost::array
dilakukannya.Seorang mem-inisialisasi menggunakan inisialisasi langsung. Dan aturan klausul 8 melarang hal semacam ini. Saya tidak begitu yakin tentang kasus berikut, tetapi beberapa kompiler mengizinkannya.
Lihat PR GCC ini untuk detail lebih lanjut.
Ya mereka melakukanya. Namun sintaks Anda tidak valid, saya kira. Anda harus menggunakan kawat gigi secara langsung untuk mengaktifkan inisialisasi daftar
sumber
char * const foo[6];
anggota kelas. Ini membutuhkan penginisialisasi untuk dikompilasi dalam C ++ 11.C ++ 98 tidak menyediakan sintaks langsung untuk apa pun kecuali memusatkan perhatian (atau untuk elemen non-POD, menginisialisasi nilai) larik. Untuk itu Anda hanya menulis
C(): arr() {}
.Saya pikir Roger Pate salah tentang dugaan batasan inisialisasi agregat C ++ 0x, tetapi saya terlalu malas untuk mencarinya atau memeriksanya, dan tidak masalah, bukan? EDIT : Roger berbicara tentang "C ++ 03", saya salah membacanya sebagai "C ++ 0x". Maaf, Roger. ☺
Solusi C ++ 98 untuk kode Anda saat ini adalah dengan membungkus array dalam a
struct
dan menginisialisasinya dari konstanta statis jenis itu. Bagaimanapun, data harus berada di suatu tempat. Di luar manset akan terlihat seperti ini:sumber
Solusi:
sumber
Di C ++ 03, inisialisasi agregat hanya berlaku dengan sintaks yang mirip seperti di bawah ini, yang harus berupa pernyataan terpisah dan tidak sesuai dengan penginisialisasi ctor.
sumber
Bagaimana tentang
?
Mengompilasi dengan baik pada g ++ 4.8
sumber
Anda ingin memasukkan array int di konstruktor Anda? Arahkan ke array statis.
sumber