Menggunakan initialize()
metode untuk kelas bertentangan dengan prinsip konstruktor kelas, yaitu sekali instance kelas telah dibangun , itu harus " siap digunakan ".
Seperti yang disarankan oleh jawaban Ignacio, sintaksis penempatan C ++ jauh lebih baik untuk tujuan Anda.
Namun, dengan perpustakaan Arduino, sintaksis penempatan tidak didukung "out of the box", jadi Anda harus menerapkannya sendiri; jangan takut, itu cukup mudah:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
Sintaksis penempatan dapat menjadi binatang yang rumit di C ++, tetapi untuk tujuan spesifik Anda, penggunaannya bisa agak sederhana:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
Perbedaannya dengan kode Anda saat ini foo
adalah sekarang menjadi pointer, karenanya panggilan metode apa pun akan digunakan ->
sebagai ganti .
.
Jika Anda benar-benar ingin terus menggunakan foo
sebagai instance dan bukan pointer, maka Anda dapat melakukannya (tapi saya tidak menyarankannya seperti yang dijelaskan nanti) dengan menggunakan referensi sebagai gantinya:
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
Masalah dengan kode ini, adalah Anda tidak bisa tahu apakah foo
sudah dibangun dengan FOOOBJ
instance nyata atau tidak; menggunakan pointer, Anda selalu dapat memeriksa apakah itu benar 0
atau tidak.
Menggunakan sintaksis penempatan, Anda harus sadar bahwa Anda tidak dapat delete
membuat foo
instance di atas. Jika Anda ingin menghancurkan foo
(yaitu memastikan bahwa destruktornya disebut), maka Anda harus secara eksplisit memanggil destruktor:
foo->~FOOOBJ();
FOOOBJ
adalah objek OneWire, menggunakan perpustakaan Jim Studt (v2.2). Saya menerima pesanerror: no matching function for call to 'operator new(unsigned int, byte [14])'
melaluinew
telepon. Sepertinya avr-g ++ mungkin tidak mengerti sintaks.