2017-02-02 10 views
0

私はリストの配列を保持するリストを持っています。C++ 2次元リスト

私は2つのオブジェクトタイプ "Flight"と "People"を持っています。もう1つは "Management"です。私は、作成された各Flightオブジェクトの人のリストを保持するリストを作成しました。私は、各フライトに割り当てられた人のリストを保持するリストのリストを作成しようとしています。

しかし、私は場所0のリストのリストに1つのリストしか追加できません。それを超えるものはセグメンテーション違反です。

これは私のフライトクラスです。

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毎回をインクリメントしています。リストのリスト(* list [20])には20個のスポットが割り当てられています。それが存在しない20の場所にアクセスしてセグメンテーション違反を引き起こす理由を理解できません。 ご協力いただければ幸いです。

答えて

0

list2[currentPos1]=& flight; 

(完全なコードを持っていませんでした、少なくとも私のコンパイラでは)次のように私はManagementに機能addFlight()を変更し、それが働きましたどこでもlist2のポインタのためのストレージ。 addFlight()への最初の呼び出しがsegfaultでないことはランダムです。このコード

*list2[currentPos1] 

は、ランダムなメモリ位置の逆参照を終了します。あなたはこのように変更した場合:

list2[currentPos1] = &flight; 

まあflightが離れて、​​すぐaddFlight()としてリターンを行くために起こっている関数のパラメータであるので、程度の悪いもの。

なぜポインタとネイティブ配列を使用していますか?それをしないでください。 std::vectorを使用してください。 変更list2

std::vector<Flight> list2; 

へと addFlight()

list2[currentPos1] = flight; 
+0

ありがとうございます。私たちはベクトルを使用することは許されませんでしたが、私はあなたに正しい方向を指示しました。割り当て場所の割り当ては list [currentPos] =新しいint [maxPeople]; // list [20]の配置場所[this] – Mish

+0

私は本当に教師がC++のサブセットを教えてくれないことを本当に望んでいます。それはあなたにあらゆる種類の悪い習慣を教えています。動的メモリを直接使用する前に、 'std :: vector'と他の標準コンテナの使用に精通する必要があります。 –

-1

origiinallyあなたが初期化または割り当てない

*list2[currentPos1]=flight; 
+0

にあなたは関数パラメータのアドレスを取っています。それは未定義の行動と最終的にはsegfaultsにつながるでしょう。 –

+0

ええ、訂正のおかげでそれに注意を払わなかった。もう一つの方法は、彼(OP)が代わりにf1とf2のアドレスを渡すことができる – monster

+0

あなたの答えを修正する場合、downvoteは消えるかもしれません... –