回答:
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();
new
何もせず、一部の入出力を初期化するだけです。
配置構文を使用して、クラスをインスタンス化する既存の割り当てを指定できます。
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 ++が構文を理解できないようです。