Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;无法通过指向该对象的指针将指针指定给该对象_C++_Oop_Pointers - Fatal编程技术网

C++ c++;无法通过指向该对象的指针将指针指定给该对象

C++ c++;无法通过指向该对象的指针将指针指定给该对象,c++,oop,pointers,C++,Oop,Pointers,通过将指针分配给指向该对象的另一个指针,我无法将指针分配给该对象。这是我的密码: 在地图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

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

在地图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;
        }
};
但我得到的是:

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

在下面的代码中,您将指针分配给按值传递的参数,这意味着只要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*)。但您可能希望重新考虑您的设计,只保留对象的副本,而不是指向其他地方声明的对象的指针。这样做会减少脆弱性,因此您不太可能犯导致程序崩溃的错误。

您传递的是值和这些值 您正在创建临时副本并记录其地址, 当然,一旦它们超出范围,就会失效

更改Initialize的签名以获取指针或引用

`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");`

伙计!非常感谢,它很有魅力!这件事困扰了我好长时间了。现在它可以正常工作了:尽管如此,这里有一个突出的设计问题,那个就是谁拥有这些物品的所有权?地图应该具有共享所有权吗?唯一所有权?共享和唯一的ptr将更清晰、更不脆弱。只有在能够保证所引用的对象比保存引用的对象寿命更长的情况下,才应该获取引用。
`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");`