Я пишу несколько библиотек arduino и хочу улучшить удобочитаемость/добавить некоторый синтаксический advar.Целенаправленное создание анонимного объекта на куче
То, что я хотел бы сделать, это создать объекты в куче так, что будет выглядеть так:
Panel panel(
Button(1).on(Click(clickfunc)),
Button(2).on(Hold(holdfunc, 1000))
);
(кнопка, нажмите, удерживайте все классы и внутренне управляемые с помощью связанных списков (так что они Арен 't constant.))
Я пробовал писать это так, но я наткнулся на проблемы со ссылками на временные.
В настоящее время я могу использовать:
Button button1(1), button2(2);
Click theClick(clickFunction);
Hold theHold(holdFunction, 1000);
Panel(button1.on(theClick), button2.on(theHold));
, но это не так читаемым, как указано выше, и, как правило, подвержены ошибкам, потому что вы должны оставаться бдительными и не ставить, например, aClick на другой кнопке, которая сломает связанный список.
Некоторые тяжелые укороченные выдержки из таких классов, как они сейчас.
class Button {
Handler *_first;
Button(int no){...}
Button & on(Handler &handler){
handler._next = _first;
_first = &handler;
return *this;
}
void handle(int oldValue, int newValue) {
Handler *handler;
for(handler = _first; handler; handler = handler->_next){
handler->handle(oldValue, newValue);
}
}
}
class Handler {
Handler *_next;
virtual void handle(int oldValue, int newValue) = 0;
...
}
class Click : public Handler {
...
}
class Hold : public Handler {
...
}
Обратите внимание, что это необязательно должно оставаться таким образом. Цель состоит в том, чтобы предоставить библиотеку, где ее пользователю не нужно много знать о своей внутренней работе, но имеет простой/чистый интерфейс.
Примечание: Объекты в куче всегда анонимны, так как они никогда не имеют name: они никогда не являются переменными. –
Можете ли вы добавить точные ошибки, которые вы получали, когда пытались выполнить одну строку? – George
@drescherjm: может быть. Но почему вы думаете, что это не на куче? (Или я неправильно использую слово «куча» в контексте cpp?)) – Scheintod