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