2017-02-02 48 views
0

我有一個列表,其中包含列表數組。C++ 2維列表

我有2個對象類型「飛行」和「人」另一個是「管理」。我創建了一個列表,其中包含每個Flight對象的人員列表。我正在嘗試製作一份列表,列出分配給每個航班的人員列表。

但我只能將1個列表添加到位置0的列表中。除此之外的任何內容都是分段錯誤。

這是我的Flight Class;

class Flight { 
public: 
    int maxPeople; 
    int currentPos = -1; 
    int flightNo; 
    People list[50]; // list of people 
    public: 
    Passenger *list; 
    Flight(); 
    Flight(int maxPassenger, int flightNo); 
    void addPeople(Passenger passenger); 
}; 

class Management { 
public: 
const int maxFlights=20; 
public: 
Management(); 
addFlight(Flight flight); 
}; 

這是我實現的原型:

//Global Variables 
int currentPos1=-1; // 
Flight *list2[20]; //list of list 

//Constructor 
Flight::Flight(int maxPeople2, int flightNo2) { 
maxPeople = maxPeople2; 
list = new People[maxPassenger]; //List means List of Passengers 
flightNo = flightNo2; 

Management::Management() {}; 

//Addflight 
void Management::addFlight(Flight flight) { 
    currentPos1++; 
    *list2[currentPos1] = flight; 
} 

//Main 
int main(void) { 
Flight f1 (25, 333); 
Flight f2 (25, 444); 
a.addFlight(f1); // works 
a.addFlight(f2); //Segfault 
} 

我遞增currentPos1每次我補充。列表(*列表[20])列表分配了20個點。我無法弄清楚爲什麼它會嘗試訪問一個不存在的地方,導致分段錯誤。 任何幫助將不勝感激。

回答

0

你不初始化或分配存儲在任何地方list2任何指針。第一次撥打addFlight()不是段錯誤是隨機的。此代碼

*list2[currentPos1] 

最終取消引用隨機內存位置。如果你把它改成這樣:

list2[currentPos1] = &flight; 

嗯,這是我們所糟糕,因爲flight是那將會消失儘快addFlight()返回函數的參數。

你爲什麼使用指針和本地數組?不要這樣做。使用std::vector。 更改list2

std::vector<Flight> list2; 

addFlight()

list2[currentPos1] = flight; 
+0

Thankyou。我們沒有被允許使用矢量,但你確實指向了我的正確方向。分配位置解決了它 list [currentPos] = new int [maxPeople]; //爲列表分配位置[20] [this] – Mish

+0

我真的很希望教師不會先教C語言的C++子集。它教你各種不良習慣。在你直接使用動態內存之前,你應該熟練使用'std :: vector'和其他標準容器。 –

-1

Management更改的功能addFlight()如下,它的工作(ATLEAST在我的編譯其中沒有必須完成的代碼)

list2[currentPos1]=& flight; 

這origiinally是

*list2[currentPos1]=flight; 
+0

你把一個函數參數的地址。這將導致未定義行爲並最終導致段錯誤。 –

+0

是的,感謝糾正沒有注意到它。另一種方法是他(OP)可以自己傳遞f1和f2的地址 – monster

+0

如果你修復你的答案,downvote可能會消失... –