2

次の変数/メンバーを持つクラスがあります。

ファーストネーム

苗字

住所など。

値を返すそれぞれのgetterメソッドを作成したいと思います。クラスによってはかなり大きくなる場合があります。

1つのメソッドを使用するだけでこれを実行できる、より高速な、またはよりオブジェクト指向の方法はありますか?私が考えることができる唯一の方法は、返される変数の名前のパラメーターを受け取るメソッドを持つことです。ただし、メソッドのタイプは、文字列、intなどを返すかどうかによって異なります。

誰かが解決策を持っていますか?

4

6 に答える 6

3

なぜクラスの外でこれらの値が必要なのですか? Person4 つまたは 5 つPerson GetWhatever()のメソッドを呼び出して文字列を結合したり、文字列の間にコンマを挿入したりするコードが含まれていない場合は、そのコードを に移動しますPerson。これで十分です。外部のコードでPersonゲッターを呼び出す必要はありません。

一部のクラスはロジックがなく、値を保持するだけで、外部オブジェクトがすべての作業を行うことを期待しています。C++ では、そのための構造体を使用すると、意図が明確になります。外部のコードが Person の要素に任意にアクセスする必要があると主張する場合Person、それはおそらくクラスではなく構造体です。クラスであると主張する場合は、実際のビジネス ロジックをクラスに追加して証明してください。

于 2012-09-18T16:18:36.320 に答える
1

セッター/ゲッターを簡単に定義したい場合は、シングルメンバーレベルで作成してください。setter / getterを使用してメンバーテンプレートを作成し、それをクラスのパブリック要素として定義します。

template <class Type>
class Member {
public:
  Member(const T& value = T()) : value(value) {}
  void setValue(const Type& t) { value = t; }
  T getValue() const { return value; } 
private:
  T value;
};

あなたのクラスでそれを使用してください:

class Person {
public:
   Member<std::string> firstName;
   Member<std::string> lastName;
   Member<std::string> address;
   Member<unsigned>    age;
};

そして使用法:

int main() {
   Person one;
   one.firstName.setValue("Joe");
   one.age.setValue(33);
}

いくつかの制約(範囲チェックなど)が必要な場合は、RangeCheckingMemberテンプレートを定義します。メンバーを相互に依存させる必要がある場合は、ポインター/参照によってメンバー間の関係を作成します。

于 2012-09-18T17:35:44.297 に答える
1

いいえ、まだオブジェクト指向である「より良い」方法はありません。クラス外でアクセスする必要があるプライベート メンバー変数ごとに、1 つのパブリック「ゲッター」メソッドを定義する必要があります。変数をクラス外から設定する場合は、setter メソッドも定義する必要があります。

于 2012-09-18T15:59:13.060 に答える
0

あなたはあなたが何を望んでいるのか知っているので。

void get(int flag, void *return_value)

return_valueあなたが望むものへのtypdキャストを取得します。

ありがとう

于 2012-09-18T16:55:35.877 に答える
0

すべてがいくつかの Object クラス (QObject など) をサブクラス化するライブラリを使用している場合、 a を使用しmap of (string, object)てすべてのデータを保持し、次のようにアクセスできます。

Object get(string name) { return memebers[name]; }

members is std::map<std::string, Object>

もちろん、型キャストを使用する必要があります。

Button* my_var = static_cast<Button*>(my_class.get("my_button")); 
// get returns Object

Qt を使用している場合は、Qtのプロパティ システムも使用できます。これは標準の C++ ではありませんが、qmake と moc は多くのオペレーティング システムで動作します。

于 2012-09-18T16:05:47.337 に答える
0

特定の型の既定値を取るテンプレート メンバー関数を使用して、そのパラメーター ルックアップを作成することを検討してください。

template<typename ValueType>
const ValueType& get(const KeyType& key, const ValueType& default value) {
   ...
};

KeyTypeすべての値を列挙 (または一覧表示) し(またはstd::string、より大きなケースでは適切な値を使用)、 上のストレージを行ったり来たりする必要がありますValueType

したがって、任意に大きな値または完全に動的な値が必要であると判断するまで、これはあまり役に立ちません。この時点で、厄介な共用体またはマップで使用される共通の基本クラスから派生したテンプレート ラッパー クラスのいずれかを必要とする任意の型を保持できるマップを実装する必要があります。

これの利点は、getKeys()メソッドがクラスで使用可能なすべてのキーを提示できることです。これは、動的 GUI とメッセージ処理に非常に役立ちます。

于 2012-09-18T15:58:33.440 に答える