3

一意のキーと任意の値を文字列として格納するプロパティ クラスを作成しています (さらに、構成ファイルへの書き込み時に使用するオプションのコメント文字列)。現在、生の文字列を保持する基本プロパティ クラスを作成し、これをタイプ固有のプロパティにサブクラス化する方法を使用しています。文字列を int に変換する getValue() 関数を実装する IntProperty - プロパティ値を読み取るたびに文字列から手動で変換する必要がないようにします。これらのサブクラスは、getPropertyType() という仮想関数を使用します。これは、ベースで定義され、各派生でオーバーライドされる仮想関数であり、保持するプロパティのタイプを識別する列挙型の値を返します。ベース クラスは「none」識別子を返します。

(ちなみに、私は Qt を使用しており、Qt に必要なインターフェイス マクロがテンプレート化されたオブジェクトをサポートしていないため、テンプレートを避けました。テンプレートを使用する価値がある場合は、インターフェイスを使用するという考えを捨てるかもしれません。)

私の意図は、基本プロパティ クラスからサブクラス化し、基本プロパティ ポインターの配列を許可することで、複数の異なる種類のプロパティ (string、int、float...) のリストを許可することでした。ただし、派生クラスの 1 つからプロパティを特定の型として抽出するのが非常に厄介になるという問題に遭遇します。これは、基本クラスへのポインターが派生クラスで新しく定義された getValue 関数を明らかに認識していないためです。基本クラスから文字列を抽出して手動で変換するか、基本クラスのポインターを正しい派生クラスのポインターにキャストするかのいずれかのオプションが残っています。最初のオプションでは、変換を手動で行う必要があるため、サブクラス化が役に立たなくなります。

この問題を解決する最も賢明な方法は何でしょうか? プロパティ値の取得をできるだけシンプルに保ちたいと考えています。配列から基本クラスのポインターを取得してから、プロパティの値の適切に型指定されたコピーを保持するまでのボイラープレート コードをできるだけ少なくします。問題を逆に検討する価値はありますか?文字列を使用してそれぞれの値の取得と設定をすべてサポートする、複数の厳密に型指定されたプロパティ クラスがありますか?

4

2 に答える 2

2

確かに、受信側は取得しているタイプを知る必要があるため、返されるものを示す名前を使用します。

int GetInt(const string& key);
string GetString(const string& key);
double GetDouble(const string& key); 

などはそれを呼び出すのと同じくらい良いでしょうGet(const string& key)-そしてC ++言語では戻り値の型だけを区別することはできないので、それはうまくいきません.

別の選択肢はもちろん、

template <typename T>
void Get(const string& key, T& value);

(実際にはすべての異なるバリアントを異なる方法で実装する必要があるかもしれないので、テンプレートを使用してもあまり役に立たないかもしれませんが、テンプレートとして回答を書く方がはるかに簡単です! ;) )

于 2013-07-03T22:00:23.253 に答える
2

これはどうですか?(テストされていませんが、アイデアを得る必要があります)

class BaseType {
public:
    virtual void getValue(string &s) { s = "";                            };
    virtual void getValue(int &i)    { i = 0;                             };
    virtual void getValue(double &d) { d = 0.0;                           };
};

class IntType : public BaseType {
public:
    virtual void getValue(string &s) { s = to_string(myvalue);            };
    virtual void getValue(int &i)    { i = myvalue;                       };
    virtual void getValue(double &d) { d = static_cast<double>(myvalue);  };
private:
    int myvalue;
};

class DblType : public BaseType {
public:
    virtual void getValue(string &s) { s = to_string(myvalue);            };
    virtual void getValue(int &i)    { i = static_cast<int>myvalue;       };
    virtual void getValue(double &d) { d = myvalue;                       };
private:
    double myvalue;
};

class StrType : public BaseType {
public:
    virtual void getValue(string &s) { s = myvalue;                       };
    virtual void getValue(int &i)    { i = stoi(myvalue);                 };
    virtual void getValue(double &d) { d = stod(myvalue);                 };
private:
    string myvalue;
};
于 2013-07-03T23:29:27.140 に答える