0

3 つのクラスを含むコードがあります。関連するクラス構造には、次のものが含まれます。

  • class1 には class2 のインスタンスへのポインタが含まれています
  • class2 には、クラス 3 のプライベート クラスと、クラス 3 への参照にアクセスする関数が含まれています。
  • class3 には、プライベート マップ クラスと、マップが空かどうかをチェックする関数が含まれています。

私が抱えている問題は、これを次のように設定すると、アクセス違反が発生することです。

bool result = class1->class2->GetProperties().CheckEmpty();

しかし、次のように設定すると、エラーは発生しません。

bool result = class2->GetProperties().CheckEmpty();

別のクラス層を追加すると、突然この問題が発生するのはなぜですか?

エラーを再現するために使用しているコードを次に示します。メインの 2 行はエラーを生成しませんが、それらをコメント化し、他の 2 つのコメントを解除すると、エラーが発生します。

#include "stdafx.h"
#include <map>

class PropertySet 
{
    public:
        PropertySet::PropertySet(){};
        PropertySet::~PropertySet(){};

        bool CheckEmpty() const { return properties.empty(); }

    private:
        std::map< std::string, std::string > properties;
};

class Tile 
{
public:
    Tile::Tile() {};
    Tile::~Tile() {};

    // Get a set of properties regarding the tile.
    const PropertySet &GetProperties() const { return properties; }

private:

    PropertySet properties;
};

class Tileset 
{
public:
    Tileset::Tileset(){};
    Tileset::~Tileset(){};

    Tile* tile;
};

int main()
{
    bool test = false;

    //NO error-----------------------------
    Tile* t = new Tile();
    test = t->GetProperties().CheckEmpty();
    //-------------------------------------

    //ERROR--------------------------------
    //Tileset* t = new Tileset();
    //test = t->tile->GetProperties().CheckEmpty();
    //-------------------------------------

    delete t;

    return 0;
}
4

1 に答える 1

1

新しい Tileset を作成すると、Tile へのポインターは初期化されません。

Tileset::Tileset(){};
Tileset::~Tileset(){};

する必要があります

Tileset::Tileset(){ tile = new Tile(); };
Tileset::~Tileset(){ delete tile; };
于 2013-08-07T02:21:34.350 に答える