オブジェクトを動的に作成するためにクラス ファクトリを使用しています。シンプルにするためにこの回答を使用しました(そしてQtを使用しているため)。
しかし、コンストラクターに引数を追加する必要があることに気付きました
Item(bool newItem /* = true*/);
それ以外の
Item();
参照された回答のコードの場合:
template <typename T>
class ClassFactory
{
public:
template <typename TDerived>
void registerType(QString shape)
{
_createFuncs[shape] = &createFunc<TDerived>;
}
T* create(QString shape)
{
typename QMap<QString, PCreateFunc>::const_iterator it = _createFuncs.find(shape);
if (it != _createFuncs.end())
{
return it.value()();
}
return NULL;
}
private:
template <typename TDerived>
static T* createFunc()
{
return new TDerived();
}
typedef T* (*PCreateFunc)();
QMap<QString, PCreateFunc> _createFuncs;
};
クラスを登録しました
classFactory.registerType <Type1_Item> ("type1");
必要に応じて、私は電話しました
Item* item = classFactory.create("type1");
コンストラクターの引数を表すために、クラス ファクトリに追加の引数を追加しようとしていますが、私の試みはすべてエラーになります。
なぜ私はそれが必要なのですか: 単純なケース:
新しいオブジェクトを作成 - デフォルトを設定します。特定のオブジェクトでは、ファイルからデータをロードする必要があるため、ファイルを開くダイアログが必要です。
オブジェクトの読み込み - ファイル情報を含むオブジェクトのファイル名を含むデータを入力します
「ロード」機能を呼び出すには、オブジェクトが存在している必要があります。つまり、新しいオブジェクトを作成すると、必要がないにもかかわらず、ファイルを開くダイアログが表示されます。
私が見る回避策は、コンストラクターの後にセットアップ関数を配置することです。しかし...つまり、オブジェクトの構築には常に2つの関数呼び出しが必要であり、設計が悪いようです。
そのため、次のような単純な呼び出しを使用してクラスを登録して呼び出す方法を探しています
classFactory.registerType <Type1_Item> ("type1", bool);
Item* item = classFactory.create("type1", true);
それは可能ですか、どうすればできますか?