我无法通过将指针分配给指向该对象的另一个指针来分配该对象的指针。 这是我的代码:

在Map.h中:

using namespace std;
class Map;
Map *CurrentMap;
class Map
{
    private:
        Map *NM, *EM, *SM, *WM;
        string NMe, EMe, SMe, WMe;
    public:
        void Initialize(Map N, Map E, Map S, Map W, string MeN, string MeE, string MeS, string MeW)
        {
            NM = &N; EM = &E; SM = &S; WM = &W;
            NMe = MeN; EMe = MeE; SMe = MeS; WMe = MeW;
        }

        void GoNorth()
        {
            cout << NMe << endl;
            CurrentMap = NM;  //This is the problem, this is where it crashes my program
        }

        void GoEast()
        {
            cout << EMe << endl;
            CurrentMap = EM;
        }

        void GoSouth()
        {
            cout << SMe << endl;
            CurrentMap = SM;
        }

        void GoWest()
        {
            cout << WMe << endl;
            CurrentMap = WM;
        }
};

在Main.cpp中:

#include <iostream>
#include <string>
#include "Map.h"
using namespace std;

int main()
{
    Map A,B,C,D,E,F;
    A.Initialize(B,C,D,E,"Towards B","Towards C","Towards D","Towards E");
    B.Initialize(D,F,A,F,"Towards D","Towards F","Towards A","Towards F");
    C.Initialize(F,E,F,A,"Towards F","Towards E","Towards F","Towards A");
    D.Initialize(A,F,B,F,"Towards A","Towards F","Towards B","Towards F");
    E.Initialize(F,A,F,C,"Towards F","Towards A","Towards F","Towards C");
    F.Initialize(A,A,A,A,"Towards A","Towards A","Towards A","Towards A");
    CurrentMap = &A;

    CurrentMap->GoNorth();
    CurrentMap->GoNorth();
    CurrentMap->GoNorth();
    system("pause");
    return 0;
}

上面的代码的预期输出是:

    Towards B
    Towards D
    Towards A

但是我得到的是:

    Towards B
    //Crash, Unhandled Exception: Access violation reading location 0xcccccccc 

===============>>#1 票数:1 已采纳

您按值传递,并使用这些值创建临时副本并获取它们的地址,一旦它们超出范围,这当然将是无效的。

更改初始化的签名以获取指针或引用。

`void Initialize(Map *N, Map *E, Map *S, Map *W, string MeN, string MeE, string MeS, string MeW);`

并在初始化时获取地址。

`A.Initialize(&B, &C, &D, &E,"Towards B","Towards C","Towards D","Towards E");`

===============>>#2 票数:0

在下面的代码中,您正在将指针分配给按值传递的参数,这意味着,一旦Initialize()返回,则类的指针现在指向不再存在的对象。

    void Initialize(Map N, Map E, Map S, Map W, string MeN, string MeE, string MeS, string MeW)
    {
        NM = &N; EM = &E; SM = &S; WM = &W;
        NMe = MeN; EMe = MeE; SMe = MeS; WMe = MeW;
    }

如果您确实希望您的类保留指向您在main()中声明的对象的指针,则需要进行按引用传递:

    void Initialize(Map & N, Map & E, Map & S, Map & W, string MeN, string MeE, string MeS, string MeW)
    {
        NM = &N; EM = &E; SM = &S; WM = &W;
        NMe = MeN; EMe = MeE; SMe = MeS; WMe = MeW;
    }

...或者您可以更改Initialize()来接受指针参数(例如Map *)。 但是您可能想重新考虑设计,只保留对象的副本,而不是指向在其他地方声明的对象的指针。 这样可以减少脆弱性,因此您不太可能犯导致程序崩溃的错误。

  ask by Shadow translate from so

未解决问题?本站智能推荐:

2回复

用C ++指向对象的指针

我试图通过一个实现简单车辆路径问题的小项目来掌握C ++指针和对象。 即使我的代码目前正在运行,我也不能动摇我的方法完全错误的感觉。 什么烦我,是代码片段,如: if条件中的指针地狱情况是get方法返回指向已创建对象的指针的结果。 被调用的方法是: 和 我在这里完全
3回复

指向对象表的指针

我想在所有Spam方法中使用对象的foo数组。 创建一个对象时,这种方法(当然带有一个*)对我有用。 但是,即使我使用Bar ** foo或Bar ** foo [2],Xcode也会告诉我创建了对象的新指针。 Xcode屏幕拍摄 [edit]我注释了错误的代码示例,
8回复

指向类中对象的指针,C ++新手问题

为什么在C ++中,对于对象A,B 为什么第2种情况有效,但第1种情况无效? 编辑:我现在知道了。 但是对于情况1,如果A的实例被释放,它的bb也会被自动释放吗? 情况#2您必须显式调用bb = NULL对吗?
2回复

C ++对象给我一个错误:正在释放的指针未分配

我正在尝试创建自己的String类以供练习,但遇到了问题。 当我编译程序时,它将产生以下错误: “ a.out(3013,0x7fff9a0ee3c0)malloc: *对象0x7fff50312ba0出错:未分配释放的指针*在malloc_error_break中设置一个断点以调试中止
2回复

指针c ++对象和变量

因为我目前正在学习C ++中的指针,所以我想知道语法。 因此,当我想在对象上使用指针时,我不必取消引用它,以便访问类属性。 当我只想在一个简单变量上使用指针时,我必须使用*来改变它的值。 那么为什么我不必使用*作为对象呢? 因为我认为我只会更改内存地址。 宾语: 变量:
2回复

在C ++语言中,如何创建一个指向数组的指针的新对象?

我正在使用第3方库,在其中以这种方式声明方法: 如果是单个.cpp文件,则可以使用: 完整的示例代码可以在这里看到: https : //github.com/itead/ITEADLIB_Arduino_Nextion/blob/master/examples/CompText
1回复

使用void *指针指向对象的安全性

很长的故事: 目前,我被分配使用遗留C项目,需要更新以与新摄像头设备集成。 来自设备制造商的API非常简单,我需要的是将它们的头文件和库包含在我的类中以使用该设备,例如这里是一段代码示例代码: MyClass.h 要与设备集成: MyClass.cpp 但生活
2回复

如何初始化指向对象的动态指针数组?

我可以在第一个构造函数中做些澄清。 如何正确保存传递的Leg对象的指针? 当前得到“在构造函数中Route :: Route(const Leg&)”:错误:预期的主表达式在“。”之前。 令牌”
3回复

使用指向creat对象的指针访问冲突错误

所以我刚开始使用C ++进行Windows编程。 首先,我绘制一些线条并且没关系,然后我尝试创建一个用于绘制某些形状的类,当我使用普通方法创建对象时(在代码中这些部分被注释掉),它工作正常,但是当我正在使用指针来创建新对象,我收到了Access violation错误。 这是我的课程(我
1回复

解引用指向类内部对象的指针

我有SquareMatrix定义SquareMatrix 方阵 我试图通过调用SquareMatrix::LUDecompose()来设置Lptr , Uptr (也许还有Pptr SquareMatrix::LUDecompose() 。 定义如下: 在尝试测试此功能时