我正在尝试访问Reservation结构的变量名称,例如这个酒店[SomeIndex] .reservations [AnotherIndex] .name但它不起作用。
如何访问这些变量以填充结构?
PS:它编译,但它在调试器Segmentation Fault中显示。
struct Reservation{
string name;
};
struct Hotel {
string name;
Reservation *reservations;
};
int main()
{
struct Hotel *hotel;
hotel = new Hotel[20];
hotel->reservations=new Reservation[10];
hotel[9].name="Olympus Plaza";
hotel[9].reservations[5].name="John Doe";
cout<<"Hotel: "<<hotel[9].name<<" Name: "<<hotel[9].reservations[5].name<<endl;
return 0;
}
答案 0 :(得分:1)
hotel->reservations=new Reservation[10];
相当于hotel[0].reservations=new Reservation[10];
。您已初始化hotel[0]
,但没有hotel
的其他元素 - 特别是hotel[9]
。
看起来你需要的是为Hotel
和Reservation
定义构造函数,将其所有成员初始化为明确定义的值。
我强烈建议你使用std::vector
而不是原始数组;数组是一项高级功能,很容易出错。
答案 1 :(得分:1)
您未正确初始化预订。使用原始指针正确执行此操作非常困难且容易出错,并且绝对不建议在C ++中使用。
首先,使用std::vector<Hotel>
代替原始数组Hotel *
。向量是普通的C ++&#34;数组&#34;对象。
然后,您也可以使用Reservation *
替换Hotel
结构中的原始std::vector<Reservation>
指针。
这使得更容易修复实际错误:缺少初始化。
您所做的是创建20家酒店,然后为第一家酒店创建10个预订!然后,您尝试访问第9家酒店的预订,其中有一个未初始化的指针指向随机数据。这意味着行为未定义:在这种情况下,分段错误是系统向您显示您正在访问不属于您的数据的方式。
您需要一个循环来为每家酒店创建预订,或者如果您只想在第9家酒店预订,您需要指定其索引。
使用std::vector
非常简单:
#include <vector>
struct Reservation {
string name;
};
struct Hotel {
string name;
vector<Reservation> reservations;
// if you have no "using namespace std", then it's "std::vector".
};
然后您可以为正确的酒店创建预订:
int main()
{
vector<Hotel> hotel(20);
hotel[9].reservations.resize(10);
hotel[9].name="Olympus Plaza";
hotel[9].reservations[5].name="John Doe";
cout<<"Hotel: "<<hotel[9].name<<" Name: "<<hotel[9].reservations[5].name<<endl;
return 0;
}