Unter Verwendung einer initialize()Methode zu einer Klasse steht im Widerspruch zu dem Prinzip eines Klassenkonstruktors, dh sobald eine Klasseninstanz wurde konstruiert , sollte es „sein einsatzbereit “.
Wie in Ignacios Antwort vorgeschlagen, ist die C ++ - Platzierungssyntax für Ihren Zweck viel besser.
Bei Arduino-Bibliotheken wird die Platzierungssyntax jedoch nicht "out of the box" unterstützt, sodass Sie sie selbst implementieren müssen. Keine Angst, das ist ganz einfach:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
Die Platzierungssyntax kann in C ++ ein komplexes Problem sein, aber für Ihren speziellen Zweck kann ihre Verwendung recht einfach sein:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
Der Unterschied zu Ihrem aktuellen Code besteht darin, dass er foojetzt ein Zeiger ist. Daher wird jeder Methodenaufruf ->anstelle von verwendet ..
Wenn Sie unbedingt weiterhin fooals Instanz und nicht als Zeiger verwenden möchten, können Sie dies tun (ich rate jedoch nicht dazu, wie später erläutert), indem Sie stattdessen eine Referenz verwenden:
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
Das Problem mit diesem Code ist, dass Sie nicht wissen können, ob foobereits eine reale FOOOBJInstanz erstellt wurde oder nicht. Mit einem Zeiger können Sie jederzeit überprüfen, ob dies der Fall ist 0oder nicht.
Bei Verwendung der Platzierungssyntax müssen Sie sich bewusst sein, dass Sie deletedie fooobige Instanz nicht verwenden können . Wenn Sie zerstören möchten foo(dh sicherstellen möchten, dass sein Destruktor aufgerufen wird), müssen Sie den Destruktor explizit aufrufen:
foo->~FOOOBJ();
FOOOBJist ein OneWire-Objekt, das die Bibliothek von Jim Studt (v2.2) verwendet. Ich erhalte die Nachrichterror: no matching function for call to 'operator new(unsigned int, byte [14])'beimnewAnruf. Es sieht so aus, als ob avr-g ++ die Syntax möglicherweise nicht versteht.