2016-05-31 133 views
0

我試圖訪問預訂結構像這個酒店[SomeIndex] .reservations [AnotherIndex] .name但它無法正常工作的變量名稱。如何訪問數組結構在數組中struct C++中的結構?

如何訪問這些變量來填充結構? 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; 
} 
+2

它看起來像你的問題是主要的'第三行()'您在哪裏分配保留而不需要解除引用。你應該指定你想要分配哪個'酒店'10個'預訂'結構,然後再訪問你還沒有分配的酒店[9] .reservations [5]'。 – Frecklefoot

+0

另外,你應該使用std :: vector(或std :: array,因爲你似乎使用的是固定大小),但至少在struct的構造函數中做了分配(這可以避免Frecklefoot提到的問題,因爲每家酒店將分配其資源,您忘記了)。 – Borgleader

+0

謝謝@Frecklefoot:D –

回答

0

您無法正確初始化保留。用原始指針正確執行此操作很困難且容易出錯,並且絕對不推薦在C++中使用。

首先,使用std::vector<Hotel>而不是原始數組Hotel *。向量是普通的C++「數組」對象。

然後,您可以將結構中的原始Reservation *指針替換爲std::vector<Reservation>

這使得更容易修復實際的錯誤:缺少初始化。

你所做的是創建20家酒店,然後創建10個預訂第一家酒店!然後,您嘗試訪問第9家酒店的預訂,其中有一個指向隨機數據的未初始化指針。這意味着行爲未定義:在這種情況下,分段錯誤是您的系統顯示您正在訪問不屬於您的數據的方式。

您需要循環爲每個酒店創建預訂,或者如果您只是想在第9家酒店中創建預訂,則需要指定其索引。

使用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; 
} 
1

hotel->reservations=new Reservation[10];相當於hotel[0].reservations=new Reservation[10];。您初始化了hotel[0],但沒有其他hotel元素 - 具體不是hotel[9]

看起來你需要的是爲HotelReservation定義構造函數,將其所有成員初始化爲定義明確的值。

我強烈建議你使用std::vector而不是原始數組;數組是高級功能,非常容易出錯。

+1

Minor nitpick,我不會說原始數組是一種高級功能,但容易出錯。 – Borgleader

+0

@Borgleader這是一個完全合理的觀點。但我更喜歡用我的方式來表達它 - 它們應該在C++課程中被延遲教授(如果有的話),只有當更明顯的機制不適合時才應該使用它們,並且語義最多也是棘手的。 –