El uso de un initialize()
método para una clase es contrario al principio de un constructor de clases, es decir, una vez que se ha construido una instancia de clase , debe estar " lista para usar ".
Como sugiere la respuesta de Ignacio, la sintaxis de ubicación de C ++ es mucho mejor para su propósito.
Sin embargo, con las bibliotecas Arduino, la sintaxis de ubicación no es compatible "de fábrica", por lo que debe implementarla usted mismo; no temas, eso es bastante sencillo:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
La sintaxis de ubicación puede ser una bestia compleja en C ++, pero para su propósito específico, su uso puede ser bastante simple:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
La diferencia con su código actual es que foo
ahora es un puntero, por lo tanto, se usará cualquier llamada de método en ->
lugar de .
.
Si absolutamente quiere seguir usándolo foo
como una instancia y no como un puntero, puede hacerlo (pero no lo aconsejo como se explica más adelante) utilizando una referencia en su lugar:
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
El problema con este código es que no puede saber si foo
ya se ha construido con una FOOOBJ
instancia real o no; Con un puntero, siempre puede comprobar si es 0
o no.
Al utilizar la sintaxis de ubicación, debe tener en cuenta que no puede delete
la foo
instancia anterior. Si desea destruir foo
(es decir, asegurarse de que se llama a su destructor), debe llamar explícitamente al destructor:
foo->~FOOOBJ();
FOOOBJ
es un objeto OneWire, que usa la biblioteca de Jim Studt (v2.2). Recibo el mensajeerror: no matching function for call to 'operator new(unsigned int, byte [14])'
de lanew
llamada. Parece que avr-g ++ puede no entender la sintaxis.