L'utilisation d'une initialize()méthode pour une classe est contraire au principe d'un constructeur de classe, c'est-à-dire qu'une fois qu'une instance de classe a été construite , elle doit être " prête à l'emploi ".
Comme suggéré par la réponse d'Ignacio, la syntaxe de placement C ++ est bien meilleure pour votre objectif.
Cependant, avec les bibliothèques Arduino, la syntaxe de placement n'est pas prise en charge "prête à l'emploi", vous devez donc l'implémenter vous-même; n'ayez pas peur, c'est assez simple:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
La syntaxe de placement peut être une bête complexe en C ++, mais pour votre usage spécifique, son utilisation peut être assez simple:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
La différence avec votre code actuel est qu'il foos'agit désormais d'un pointeur, donc tout appel de méthode utilisera à la ->place de ..
Si vous voulez absolument continuer à utiliser foocomme instance et non comme pointeur, vous pouvez le faire (mais je ne le conseille pas comme expliqué plus loin) en utilisant une référence à la place:
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
Le problème avec ce code, c'est que vous ne pouvez pas savoir s'il fooa déjà été construit avec une FOOOBJinstance réelle ou non; à l'aide d'un pointeur, vous pouvez toujours vérifier si c'est le cas 0ou non.
En utilisant la syntaxe de placement, vous devez savoir que vous ne pouvez pas deletel' fooinstance ci-dessus. Si vous voulez détruire foo(c'est-à-dire vous assurer que son destructeur est appelé), vous devez alors appeler explicitement le destructeur:
foo->~FOOOBJ();
FOOOBJest un objet OneWire, utilisant la bibliothèque de Jim Studt (v2.2). Je reçois le messageerror: no matching function for call to 'operator new(unsigned int, byte [14])'sur l'newappel. Il semble que avr-g ++ ne comprenne pas la syntaxe.