3

クラスのポインタのベクトルを使用しようとしています。Agentクラスのメンバーのいずれかにアクセスしようとすると、不正なポインターまたはnullデータを取得します。コードは次のとおりです。

class Grue : public Agent
{
    string name;
    Room *cur_room;
 public:
   Functions()....
};

class Agent
{
        Room *cur_room;
        string name;
  public:
         Functions()....
};


Grue* Grue1 = new Grue("Test", roompointer);
vector<Agent*> agents;
agents.push_back(Grue1);
4

1 に答える 1

4

データ メンバーは、クラス内で既定でプライベートです。したがって、cur_roomname変数は Agent クラスと Grue クラスで異なります。Grue コンストラクターを呼び出すと、Grue フィールドは初期化されますが、ベクターにはエージェント ポインターが格納されるため、初期化されていないエージェント フィールドにアクセスすることになります。

これを行う正しい方法は次のとおりです。

class Agent
{
protected:
    Room *cur_room;
    string name;
public:
    Agent(string n, Room * r)
    : cur_room (r), name(n)         
    {}
};

class Grue : public Agent
{

public:
    Grue(string n, Room * r):Agent(n,r)
    {

    }
};
于 2012-05-26T00:07:19.523 に答える