私は組み込み環境 (Arduino/AVR ATMega328) で作業しており、C++ で Factory Method パターンを実装したいと考えています。ただし、使用しているコンパイラ (avr-gcc) はnew
キーワードをサポートしていません。を使用せずにこのパターンを実装する方法はありnew
ますか?
7 に答える
Factory Method の全体像はオブジェクトの作成であり、これはヒープ メモリの消費を意味します。組み込みシステムでは、RAM の制約があり、メモリの制限を念頭に置いてすべての設計上の決定を下す必要があります。ATmega328 には 2 KB の RAM しかありません。このような狭いスペースで動的に割り当てられたメモリを使用しないことをお勧めします。
あなたの問題をより詳細に知らなくても、クラスの少数のインスタンスを静的に宣言し、それらのインスタンスを何らかの方法で再利用することをお勧めします。これは、オブジェクトがいつ、なぜ作成されたか、および -- 重要なことに -- いつ、なぜ終了したかを知る必要があることを意味します。次に、一度にアクティブにする必要がある数と、一度にアクティブにできる数を把握する必要があります。
!!ディーン
実行時にクラスをインスタンス化する方法がない場合、これは不可能だと思います。できることは、コンパイル時にいくつかのオブジェクトを事前に割り当て、それらへの参照を作成し、必要に応じて返すことだけです。
厳密なコーディング標準 (「新規」または「削除」の使用が許可されていない) を持つ組み込みシステムでこの問題を解決した方法は、目的のオブジェクトの静的配列を作成することでした。次に、既に割り当てられているオブジェクトへの静的ポインターを使用し、これらの戻り値を (静的変数および/またはメンバー変数を使用して) 格納して、後でさまざまなオブジェクトを実行できるようにします。
// Class File ---------------------------------------------------
class MyObject {
public:
MyObject* getObject();
private:
const int MAX_POSSIBLE_COUNT_OF_OBJECTS = 10;
static MyObject allocatedObjects[MAX_POSSIBLE_COUNT_OF_OBJECTS];
static allocatedObjectIndex = 0;
};
// Implementation File ------------------------------------------
// Instantiate a static array of your objects.
static MyObject::allocatedObject[MAX_POSSIBLE_COUNT_OF_OBJECTS];
// Your method to return already created objects.
MyObject* MyObject::getObject() {
if (allocatedObjectIndex < (MAX_POSSIBLE_COUNT_OF_OBJECTS - 1)) {
return allocatedObjects[allocatedObjectIndex++];
} else {
// Log error if possible
return NULL;
}
}
あらかじめご了承ください。私は 8 か月以上 C++ を書いていないので、これはすべて記憶によるものです。
また、注意: これには、コンパイル時に大量の RAM を割り当てるという重大な欠点があります。
factory を使用している場合は、いくつかの仮想関数があることを示す動的バインディング動作が必要であることを意味します。ただし、malloc() を使用してオブジェクトにメモリを割り当てることは可能ですが、クラスの vtable が適切に設定されないため、仮想関数の呼び出しがクラッシュします。動的バインディングが必要な場合、これを行う方法がわかりません。
mallocできますか?もしそうなら、あなたのオブジェクトをそのようにmallocすることができます。
また、ファクトリから作成したいオブジェクトの性質は何ですか?
- それらは不変ですか?
- ファクトリは、コンパイル時に認識できるオブジェクトの限られたセットを生成することのみを目的としていますか?
両方の質問に対する答えが「はい」の場合は、不変オブジェクトのセットにメモリを静的に割り当て、ファクトリ メソッドが適切なオブジェクトへのポインターを返すようにすることができます。
いずれかの質問に対する答えが「いいえ」の場合、これは機能しません。また、このアプローチでは、常にそのメモリが割り当てられているという問題があります。