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 foo
jetzt ein Zeiger ist. Daher wird jeder Methodenaufruf ->
anstelle von verwendet .
.
Wenn Sie unbedingt weiterhin foo
als 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 foo
bereits eine reale FOOOBJ
Instanz erstellt wurde oder nicht. Mit einem Zeiger können Sie jederzeit überprüfen, ob dies der Fall ist 0
oder nicht.
Bei Verwendung der Platzierungssyntax müssen Sie sich bewusst sein, dass Sie delete
die foo
obige 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();
FOOOBJ
ist 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])'
beimnew
Anruf. Es sieht so aus, als ob avr-g ++ die Syntax möglicherweise nicht versteht.