Answers:
使用initialize()
一类方法是相反的一类构造函数的原则,即一旦一个类的实例已经被构建,它应该是“ 准备使用 ”。
正如Ignacio的答案所建议的,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();
new
,它只是初始化一些I / O。
您可以使用放置语法指定实例化类的现有分配。
FOOOBJ foo(0);
...
FOOOBJ *f = new (foo) FOOOBJ(3);
foo
,char foo[sizeof FOOOBJ];
以便FOOOBJ
构造函数不会被调用,foo
这取决于构造函数的作用可能是一个真正的问题。
FOOOBJ
是使用Jim Studt的库(v2.2)的OneWire对象。我error: no matching function for call to 'operator new(unsigned int, byte [14])'
在new
通话中收到消息。看来AVR-G ++可能不懂语法。