如何返回指向嵌套为映射值的节点的指针? (访问冲突)

时间:2019-02-16 15:58:20

标签: c++ pointers linked-list nodes access-violation

因此,我正在尝试使用链接列表创建自己的图形解释;

从本质上讲,我想创建通过n / e / s / w坐标链接到其他节点的节点,并且每次创建节点时,这些节点都会添加到列表中,我可以在以后检查“ Exists”(如果存在)存在)。

我考虑这些节点的“ yx”对坐标以确认这一点。这是我的标题如下:

class Graph {
private:
    struct Area {
        pair<int , int> yx;
        Area *north;
        Area *east;
        Area *south;
        Area *west;
    };

    Area *Start;
    Area *Current;
    map<pair<int, int>, Area*> Exists; //Need to get the stored Area from this map
public:

    Graph();
    void Create();

    //Add_Node calls Connect_Nodes()
    void Add_Node(Area before, int code, int symbol, int color, pair<int,int> yx, string title, string description, int coordinate);
    //Connects nodes if the key is found in the map
    Area* Connect_Nodes(pair<int, int> yx, int coordinate);
};

这里是实现,Add_Node()首先在void Create()中调用:

Add_Node(*Start, 00001, '.', 3, Start->yx, "Hallway", "Halls", 1);

Add_Node接下来调用连接:

void Graph::Add_Node(Area before, pair<int, int> yx, ... int coordinate){
    Area *ptr = Connect_Nodes(yx, coordinate);

和Connect方法:

Graph::Area* Graph::Connect_Nodes(pair<int,int> yx, int coordinate) {
    pair<int, int> temp;
    switch (coordinate) {
    case 1:
        temp.first = ++yx.first;
        temp.second = yx.second;
        break;
      ....
    }
    map<pair<int, int>, Area*>::iterator it;
    it = Exists.find(temp);
    if (it != Exists.end())
        return it->second;
    else return nullptr;
}

我的指针实现可能丢失了一些重要的东西,出现以下错误:

Exception thrown: read access violation.
std::_String_alloc<std::_String_base_types<char,std::allocator<char> > >::_Get_data(...) returned 0x14.

我可以很好地创建节点,但是,在Display()方法中,ptr会迭代到该节点,当我在创建的节点上运行ptr-> title时,会遇到读取访问冲突。是什么导致此错误?

我希望我已经对此进行了充分的记录,可以理解。


编辑:在我未发布的Add_Node方法中逐步发现以下内容:

void Graph::Add_Node(Area before,  pair<int, int> yx,  int coordinate){
    bool passed = true;
    Area *ptr = Connect_Nodes(yx, coordinate);
    if (ptr != NULL) {
        switch (coordinate) {
        case 1:
            before.north = ptr;
        case 2:
            before.east = ptr;
        case 3:
            before.south = ptr;
        case 4:
            before.west = ptr;
        }
    }
    else {
        do
        {
            Current = new Area;
            Current_Code++;
            Current->code = Current_Code;
            switch (coordinate) {
            case 1:
                if (before.north == NULL)
                {
                    Current->yx.first = ++before.yx.first;
                    Current->yx.second = before.yx.second;
                    Exists[Current->yx] = Current;
                    before.north = Current;  // PROBLEM LINE
                    return;
                }

当我在上面的代码中将before.north替换为Start-> north时,我可以正常显示所有内容而没有任何错误!

Start->north = Current; 

但是,由于我在整个代码中都使用了before实例,因此需要进行调整才能正常工作。

这个想法是,“之前”表示将连接到要添加的节点的现有节点。

0 个答案:

没有答案