0

Lets say I have the following class:

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);

Now both accounts user1 and user2 have different ID that is unique. Is there any way by knowing the ID of the account get the field of the object like "favNumber", if so how should it be implemented?

Something like 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 来访问它们。
  • 我们将 counter变量static作为static private.Account
  • 我们曾经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::map从 ID 到对象的Hash( ) 与
    ID 索引数组的语法类似,但它是一个哈希表查找

每个在简单性,搜索速度,使用的内存等方面都有其优点和缺点。

您还可以在上面存储对象指针。

为了使事情自动化,您可以使上面的列表成为private static您的Account类的成员,并在构造函数中添加到它。

于 2013-08-07T10:27:27.560 回答
0

您可以创建一个列表,并在每次传递构造函数时将项目添加到列表中。然后当请求进入您的getFieldById搜索列表时。

该列表必须位于您可以搜索的位置,并且只能启动一次

于 2013-08-07T10:27:38.840 回答