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 fooagora é um ponteiro; portanto, qualquer chamada de método será usada em ->vez de ..
Se você quiser continuar usando foocomo 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 foojá foi construído com uma FOOOBJinstância real ou não; usando um ponteiro, você sempre pode verificar se é 0ou não.
Usando a sintaxe do canal, você deve estar ciente de que não pode deletea fooinstâ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])'nanewligação. Parece que o avr-g ++ pode não entender a sintaxe.