O uso de um initialize()
método para uma classe é contrário ao princípio de um construtor de classe, ou seja, uma vez que uma instância de classe tenha sido construída , ela deve estar " pronta para uso ".
Conforme sugerido pela resposta de Ignacio, a sintaxe de posicionamento do C ++ é muito melhor para o seu propósito.
No entanto, nas bibliotecas do Arduino, a sintaxe de posicionamento não é suportada "pronta para uso", portanto você deve implementá-lo; não tema, isso é bem direto:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
A sintaxe da veiculação pode ser uma besta complexa em C ++, mas para seu objetivo específico, seu uso pode ser bastante simples:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
A diferença com seu código atual é que foo
agora é um ponteiro; portanto, qualquer chamada de método será usada em ->
vez de .
.
Se você quiser continuar usando foo
como instância e não como ponteiro, poderá fazê-lo (mas não o aconselho como explicado mais adiante) usando uma referência :
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
O problema com esse código é que você não pode saber se foo
já foi construído com uma FOOOBJ
instância real ou não; usando um ponteiro, você sempre pode verificar se é 0
ou não.
Usando a sintaxe do canal, você deve estar ciente de que não pode delete
a foo
instância acima. Se você deseja destruir foo
(ou seja, garantir que seu destruidor seja chamado), é necessário chamar explicitamente o destruidor:
foo->~FOOOBJ();
FOOOBJ
é um objeto do OneWire, usando a biblioteca de Jim Studt (v2.2). Estou recebendo a mensagemerror: no matching function for call to 'operator new(unsigned int, byte [14])'
nanew
ligação. Parece que o avr-g ++ pode não entender a sintaxe.