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 foo
s'agit désormais d'un pointeur, donc tout appel de méthode utilisera à la ->
place de .
.
Si vous voulez absolument continuer à utiliser foo
comme 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 foo
a déjà été construit avec une FOOOBJ
instance réelle ou non; à l'aide d'un pointeur, vous pouvez toujours vérifier si c'est le cas 0
ou non.
En utilisant la syntaxe de placement, vous devez savoir que vous ne pouvez pas delete
l' foo
instance 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();
FOOOBJ
est 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'new
appel. Il semble que avr-g ++ ne comprenne pas la syntaxe.new
rien, il initialise simplement quelques E / S.Vous pouvez utiliser la syntaxe de placement pour spécifier une allocation existante dans laquelle instancier la classe.
la source
foo
parchar foo[sizeof FOOOBJ];
afin que leFOOOBJ
constructeur ne soit pas appelé,foo
ce qui pourrait être un vrai problème selon ce que fait le constructeur.