0

次のクラスがあるとしましょう:

static int counter = 0;

class Account {
public:
   int ID;
   int favNumber;

   Account(int favNum) {
      this->ID = ++counter;
      this->favNumber = favNum;
   }
};

Account user1(4);
Account user2(9);

これで、user1 と user2 の両方のアカウントに、一意の異なる ID が割り当てられました。アカウントのIDを知ることで、「favNumber」のようなオブジェクトのフィールドを取得する方法はありますか?もしそうなら、どのように実装する必要がありますか?

getFieldById(int ID) のようなもの

4

4 に答える 4

2

これを行うために使用できますstd::map

#include <map>

class Account {
   // Make attributes private. It is a better practice
   int ID;
   int favNumber;

   static int s_Counter;
 //^^^^^^^^^^^^^^^^^^^^^ It is better to move it as a static private member of Account

public:

   Account(int favNum) {
      this->ID = ++s_Counter;
      this->favNumber = favNum;
   }

   // GETTERS
   int GetFavNumber() const { return favNumber; }
   int GetID() const { return ID; }
};

int Account::s_Counter = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^ Don't forget to initialize it

Account user1(4);
Account user2(9);

std::map<int, Account*> accounts;
accounts[user1.GetID()] = &user1;
accounts[user2.GetID()] = &user2;

// To get a favNum with some id :
accounts[id]->GetFavNumber();

ただし、この手法では、ポインターがまだ有効であることを確認してください。そうしないと、悪い驚きが生じる可能性があります...


この前のコードで何をしたのでしょうか?

  • 属性を非公開で渡しました (より良い方法)。
  • それらにアクセスするための Getter を作成しました。
  • のメンバとしてカウンタstatic変数を渡しました。static privateAccount
  • 以前std::mapは、作成されたアカウントのリストがあり、キーはアカウントの ID です。
于 2013-08-07T10:31:02.910 に答える
0

使用できます

std::map<int, Account*>

アカウントへのポインタを ID で保存します。ポインタが有効なままであることを確認するのはあなた次第です。または、使用することもできます

std::map<int, Account>

地図があなたのアカウントを管理します。

于 2013-08-07T10:27:08.303 に答える
0

作成されるすべてのオブジェクトを格納するための中央の場所が必要であり、そこで ID を検索します。

それらを次のように保存できます

  • プレーンな古い配列
    IDのオブジェクトのリスト全体を検索し、フィールドを返します

  • ID インデックス付き配列
    array[ID] は必要なオブジェクトです。フィールドを返します

  • std::mapID からオブジェクトへのHash( )
    ID インデックス付き配列と同様の構文ですが、ハッシュ テーブル ルックアップです。

それぞれに、シンプルさ、検索速度、使用メモリなどの長所と短所があります。

上記にオブジェクトポインタを格納することもできます。

物事を自動化するには、上記のリストをクラスのprivate staticメンバーにAccountして、コンストラクターで追加します。

于 2013-08-07T10:27:27.560 に答える
0

リストを作成し、コンストラクターを渡すたびにアイテムをリストに追加できます。次に、リクエストがgetFieldById検索リストに到達したとき。

リストは検索できる場所にある必要があり、一度だけ開始する必要があります

于 2013-08-07T10:27:38.840 に答える