0

いくつかのクラス (同じ基本クラス) があり、一部のユーザーのみがインスタンス化を許可されています。データベース内のユーザーに許可されたクラスを保持する必要があります。

私は間違いなくいくつかの提案が必要です。私が思うに、クラス名のリストをデータベースに文字列として保持し、文字列比較の条件でそれらをインスタンス化する必要はありません。それは私には正しくないと感じています。

典型的なシナリオは
1. GetAllowedClassesToInstantiate(user) [データベースから] を呼び出す
2. これらのクラスをインスタンス化する

何か提案はありますか?

よろしく、ブラク

4

1 に答える 1

0

次のようなデータ構造を作成します。

class BaseClass;

std::map<std::string, std::function<BaseClass*()> Factories;

次の方法で初期化します。

class One : BaseClass { ... }

void init() {
    Factories["One"] = [](){ return new One(); }
}

基本的にはルックアップとして機能しますClassName -> Constructor

許可されたクラス名をデータベースに保持します。取得した後、それをユーザーに提示し、ユーザーがオプションを選択したら、適切なコンストラクター ラッパー関数を検索し、Factoriesそれを使用して選択したクラスをインスタンス化します。

のエントリ キーを使用して、データベース エントリを最新の状態に保つようにしてくださいFactories

(コード サンプルでは C++11 を使用しました。C++03 でも、ラムダ式と を使用せずにもう少しコードを追加して同じことを行うことができますstd::functionが、考え方は同じです。)

于 2012-08-10T09:23:02.523 に答える