Использование 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 ++ может не понимать синтаксис.