L'uso di un initialize()
metodo in una classe è contrario al principio di un costruttore di classi, cioè una volta che un'istanza di classe è stata costruita , dovrebbe essere " pronta per l'uso ".
Come suggerito dalla risposta di Ignacio, la sintassi del posizionamento C ++ è molto migliore per il tuo scopo.
Tuttavia, con le librerie Arduino, la sintassi del posizionamento non è supportata "out of the box", quindi è necessario implementarla da soli; non temere, è abbastanza semplice:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
La sintassi del posizionamento può essere una bestia complessa in C ++, ma per il tuo scopo specifico, il suo utilizzo può essere piuttosto semplice:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
La differenza con il tuo codice attuale è che foo
ora è un puntatore, quindi qualsiasi chiamata al metodo utilizzerà ->
invece di .
.
Se vuoi assolutamente continuare a utilizzare foo
come istanza e non come puntatore, puoi farlo (ma non lo consiglio come spiegato più avanti) usando invece un riferimento :
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
Il problema con questo codice è che non puoi sapere se foo
è già stato costruito con FOOOBJ
un'istanza reale oppure no; usando un puntatore, puoi sempre verificare se lo è 0
o meno.
Utilizzando la sintassi del posizionamento, devi essere consapevole del fatto che non è possibile delete
l' foo
istanza sopra. Se vuoi distruggere foo
(cioè assicurati che venga chiamato il suo distruttore), devi chiamare esplicitamente il distruttore:
foo->~FOOOBJ();
FOOOBJ
è un oggetto OneWire, usando la libreria di Jim Studt (v2.2). Ricevo il messaggioerror: no matching function for call to 'operator new(unsigned int, byte [14])'
sullanew
chiamata. Sembra che avr-g ++ potrebbe non capire la sintassi.