回答:
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コンストラクタが何をするかに応じて、実際の問題になる可能性があります。
FOOOBJJim Studtのライブラリ(v2.2)を使用するOneWireオブジェクトです。通話中にメッセージが表示さerror: no matching function for call to 'operator new(unsigned int, byte [14])'れnewます。avr-g ++が構文を理解できないようです。