2016-05-31 20 views
0

私はこのホテル[SomeIndex] .reservations [AnotherIndex] .nameのようなReservation構造体の変数名にアクセスしようとしていますが、機能しません。配列へのアクセス方法配列の内部構造C++の構造体?

どのように構造を埋めるためにこれらの変数にアクセスできますか?

PS:コンパイルされますが、デバッガのセグメンテーションフォルトに表示されます。

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

あなたの問題は( 'メインの3行目であるように見えます)'あなたはそれを逆参照することなく予約を割り当てます。 10 'Reservation'構造体を割り当てる' hotel'を指定し、割り当てられていない 'hotel [9] .reservations [5]'にアクセスします。 – Frecklefoot

+0

また、std :: vector(またはstd :: arrayは固定サイズを使用しているようですので)を使用するべきですが、少なくとも構造体のコンストラクタで割り当てを行います(これはFrecklefootの問題を回避します)。各ホテルはそのリソースを割り当てていましたが、これは忘れてしまったものです)。 – Borgleader

+0

ありがとう@Frecklefoot:D –

答えて

0

予約を正しく初期化していません。これを生ポインタで正しく行うことは難しくエラーが起こりやすく、C++では絶対に推奨されません。

まず、生の配列Hotel *の代わりにstd::vector<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

微妙なニックピック、私は生の配列は高度な機能だが、エラーが起こりやすいというわけではない。 – Borgleader

+0

@Borgleaderそれは完全に合理的な意見です。しかし、私はそれを置く自分の方法を好む - 彼らはC++コースの遅れで教えられるべきである(もしあれば)、より明白なメカニズムが適切でなく、セマンティクスがせいぜい難しい場合にのみ使用されるべきである。 –

関連する問題