2

次のような仮想クラスが必要です。

class Configuration 
{
public:
    enum EPromptId;

    virtual CString getPrompt( EPromptId promptId ) = 0;
private:
};

各派生構成が独自の EPromptIds セットを持つことができるように

 class Configuration1 : public Configuration
{
public:
    enum EPromptId{
        epid_HappyBirthday
    };

    CString getPrompt( EPromptId promptId ){
        return "";
    }
private:
};

class Configuration2 : public Configuration
{
public:
    enum EPromptId{
        epid_JummpingJehoshaphat
    };

    CString getPrompt( EPromptId promptId ){
        return "";
    }
private:
};

これは、各クラスが Configuration::EPromptId パラメータ (このコードのように Configuration1::EPromptId または Configuration2::EPromptId ではない) を使用して仮想関数を実装する必要があるため、失敗します。

基本クラスにパラメーターの型を認識させて、各派生クラスで異なる値を定義することは可能ですか (おそらく、列挙型を使用せず、厳密に型指定したままにする、つまり int を使用しない)。

編集: 2 つの異なる「アプリケーション」に対して 2 つの異なる構成が必要です。プロンプトは db テーブルに保持できますが、各「アプリケーション」には独自のテーブルがあります。基本構成クラスへのポインターは、一部のハードウェアにインターフェースするクラス (つまり、実際の表示を行うクラス) に含まれています。ハードウェアは、ユーザー入力の要求と受信に使用できる io デバイスです。ハードウェア クラスが作成されると、正しい構成クラスへのポインターが渡されるため、要求されたときに正しいプロンプトが表示されます。

4

4 に答える 4

4

テンプレートを使用して、必要なもののほとんどを取得できる可能性があります...のコレクションを保持し、そのようにアクセスすることを望んでいない限りConfiguration*(そうではありませんでしたか?とにかく何を渡すかを知るためにそれらの型を知ってください....)

template< typename ENUM_TYPE >
class Configuration 
{
public:
    virtual CString getPrompt( ENUM_TYPE promptId ) = 0;
private:
};

それから

enum EPromptId{
    epid_HappyBirthday
};

class Configuration1 : public Configuration< EPromptId >
{
public:
    CString getPrompt( EPromptId promptId ){
        return "";
    }
private:
};
于 2009-08-28T15:36:37.813 に答える
0

私のC ++は少し錆びていますが、次のようなことはできませんか

struct EPromptId {
    EPromptId() mId(sId++) { }
    operator int() { return mId; }
    friend static bool operator==(EPromptId lhs, EPromptId rhs) { 
        return lhs.mId == rhs.mId;
    }
private:
    int mId;
    static int sId;
};

struct configuration1 {
    static const EPromptId epid_HappyBirthday;
    static const EPromptId epid_xxx;

    CString getPrompt(EPromptId promptId ){
        if (promptId == epid_HappyBirthday)
            return "";
        else if (promptId == epid_xxx)
    }
}

// somewhere else
EPromptId configuration1::epid_HappyBirthday;
EPromptId configuration1::epid_xxx;

各 ID を手動で制御したい場合は、int コンストラクター
EPromptId(int id) mId(id) { }を追加するだけです。

初期化を次のように変更します

EPromptId configuration1::epid_HappyBirthday = 1;
EPromptId configuration1::epid_xxx = 5;
于 2009-08-28T11:44:59.840 に答える