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