访问嵌套类中的空映射时发生访问冲突

时间:2013-08-07 02:18:20

标签: c++

我有一些包含三个类的代码。 相关的类结构包括以下内容:

  • class1包含指向class2
  • 实例的指针
  • class2包含一个私有class3类,以及一个访问类3
  • 的引用的函数
  • class3包含一个私有地图类和一个检查地图是否为空的函数

我遇到的问题是,当我这样设置时,我遇到了访问冲突:

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

但如果我这样设置,我没有任何错误:

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

为什么添加另一个类层会突然导致此问题?

以下是我用来重现错误的代码。 in main中的两行不会产生错误但会对其进行注释并取消注释其他两行,您将收到错误。

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

1 个答案:

答案 0 :(得分:1)

构造新的Tileset时,指向Tile的指针未初始化。

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

应该是

Tileset::Tileset(){ tile = new Tile(); };
Tileset::~Tileset(){ delete tile; };