【发布时间】:2023-03-16 15:03:01
【问题描述】:
我正在编写一些 arduino 库,并希望提高可读性/添加一些语法糖。
我想做的是以如下方式在堆上创建对象:
Panel panel(
Button( 1 ).on( Click( clickfunc ) ),
Button( 2 ).on( Hold( holdfunc, 1000 ) )
);
(Button、Click、Hold 都是类,通过链表在内部进行管理(因此它们不是常量。))
我尝试用这种方式编写它,但我偶然发现了引用临时对象的问题。
目前我可以使用:
Button button1( 1 ), button2( 2 );
Click theClick( clickFunction );
Hold theHold( holdFunction, 1000 );
Panel( button1.on( theClick ), button2.on( theHold ) );
但这并不像上面那样可读,而且容易出错,因为你必须保持警惕,不要把例如the单击另一个按钮会破坏链接列表。
像现在这样从课程中大量缩短的摘录。
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 {
...
}
请注意,这不一定需要保持这种状态。目标是提供一个库,用户不需要对其内部工作了解太多,但有一个简单/干净的界面。
【问题讨论】:
-
注意:堆上的对象总是匿名的,因为它们从来没有名字:它们从来都不是变量。
-
你能把你在尝试一行时遇到的确切错误添加吗?
-
@drescherjm:也许吧。但是为什么你认为它不在堆上? (或者我在 cpp 上下文中错误地使用了“堆”这个词?))
-
@George:对此我有一个单独的问题:stackoverflow.com/questions/41811375/…。错误看起来像:“错误:没有匹配函数调用‘X::X(A)’/没有已知的参数 1 从‘A’到‘A&’的转换”
-
实际上 Scheintod,C++ 并没有正式承认堆的存在。它只是一个动态存储池。不过,我很确定 Arduino 使用堆概念实现了动态内存。
标签: c++