Array data-handling with NPC class
C++ is statically typed programming language. Due to this overhead for allocation of class members is very small.
Using of global variables is not a good idea. Such vars like NUM_NPC makes your application non-scalable.
Each domain object (like a player or an item) must be described by a same-named class.




#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

typedef int Hearts;
typedef bool Gender;

struct Date
{
      Date(int month,int day) : month(month), day(day) {}
      int month;
      int day;
};

class Item
{
    // TODO: implement
};

class Player
{
public:
      Player(std::string name, Hearts hearts, Date birthday, Gender gender)
            : name(name), hearts(hearts), birthday(birthday), gender(gender) {}

      Hearts getHearts() const
      {
            return hearts;
      }

      const std::vector&lt;Item&gt;&amp; getItems()
      {
            return items;
      }

      Date getBirthday() const
      {
            return birthday;
      }

      std::string getName() const
      {
            return name;
      }
private:
      std::vector&lt;Item&gt; items;
      Hearts hearts;
      Date birthday;
      std::string name;
      Gender gender;
};

int main()
{
      using namespace std;

      vector&lt;Player&gt; players;
      players.push_back(Player("Ace", 0, Date(3,5), 0));
      players.push_back(Player("Amber", 0, Date(9,20), 1));
      players.push_back(Player("Benny", 0, Date(1,10), 0));
      players.push_back(Player("Ethan", 0, Date(12,30), 0));

      Player&amp; p = players[1];
      cout &lt;&lt; "Player 1 Details:" &lt;&lt; endl;
      cout &lt;&lt; "Name: " &lt;&lt; p.getName() &lt;&lt; endl;
      cout &lt;&lt; "Hearts: " &lt;&lt; p.getHearts() &lt;&lt; endl;
      cout &lt;&lt; "Birthday: " &lt;&lt; p.getBirthday().month &lt;&lt; "/" &lt;&lt; p.getBirthday().day &lt;&lt; endl;
      cout &lt;&lt; "Item count: " &lt;&lt; p.getItems().size() &lt;&lt; endl;
}