Использование initialize()метода к классу противоречит принципу конструктора класса, то есть когда экземпляр класса был построен , он должен быть « готов к употреблению ».
Как следует из ответа Игнасио, синтаксис размещения C ++ намного лучше для ваших целей.
Однако в библиотеках Arduino синтаксис размещения не поддерживается "из коробки", поэтому вы должны реализовать его самостоятельно; не бойся, это довольно просто:
void* operator new(size_t size, void* ptr)
{
return ptr;
}
Синтаксис размещения может быть сложным зверем в C ++, но для вашей конкретной цели его использование может быть довольно простым:
static char buffer[sizeof FOOOBJ];
static FOOOBJ* foo;
void setup() {
...
foo = new (buffer) FOOOBJ(3);
...
}
Разница с вашим текущим кодом в том, что fooтеперь это указатель, поэтому любой вызов метода будет использовать ->вместо ..
Если вы абсолютно хотите продолжать использовать fooв качестве экземпляра, а не указателя, тогда вы можете сделать это (но я не советую это, как объяснено позже), используя вместо этого ссылку :
static char buffer[sizeof FOOOBJ];
static FOOOBJ& foo = *((FOOOBJ*) buffer);
void setup() {
...
new (buffer) FOOOBJ(3);
...
}
Проблема этого кода в том, что вы не можете знать, был ли fooон уже создан с реальным FOOOBJэкземпляром или нет; используя указатель, вы всегда можете проверить, есть он 0или нет.
Используя синтаксис размещения, вы должны знать, что вы не можете deleteиспользовать fooприведенный выше пример. Если вы хотите уничтожить foo(т.е. убедиться, что вызывается его деструктор), то вы должны явно вызвать деструктор:
foo->~FOOOBJ();
FOOOBJэто объект OneWire, использующий библиотеку Джима Стадта (v2.2). Я получаю сообщениеerror: no matching function for call to 'operator new(unsigned int, byte [14])'поnewвызову. Похоже, что avr-g ++ может не понимать синтаксис.