0

ここに初めて書く。私のような他のいくつかの質問を見ましたが、私の問題を解決できませんでした。曲、プレイリスト、アルバム、アーティストの4つのクラスがあります。プレイリストは曲の配列で構成されています。アルバムはプレイリストを継承し、さらに機能性があり、アーティストはアルバムの配列やその他のもので構成されています。

Album(char* _name, Song* songs,int _sales ,int _year,int n):Playlist(songs,n)
    {
        name = new char[strlen(_name)+1];
        strcpy(name,_name);
        salesCount=_sales;
        year = _year;
    };
Playlist::Playlist(Song* _songlist, int n)
{
    if(n > 20)
    {
        cout<<"The number of song must be lesser or equal to 20"<<endl;
        return;
    } 

    SongList = new Song[n];
    for(int i = 0 ; i<n; i++)
    {
        SongList[i] = _songlist[i];
    }
numberOfSongs=n;
}

このコンストラクターを使用してアルバムを作成する場合、問題はありませんが、このコンストラクターで作成されたアルバムで構成されるアルバムの配列を作成しようとすると、メモリアクセス違反が発生します。何か案は ?

さて、コードを少し更新しました。これが私がmainメソッドでやろうとしていることです:

Song newSong("My Song", 9, 231),mySong("Your Song", 8 , 180),yourSong("His Song",7,135), herSong("Her Song",8,431);
Song songs[4] = {newSong, mySong,yourSong,herSong};
Album yourAlbum("My Album",songs,200000, 2010, 4);
yourAlbum.PrintInfo(); //<------- WORKS
Album albums[1]; //<------ It calls the deffault constructor of Album and after it gives me //"Source not available"
//When I try to declare it like this Album albums[1] = { yourAlbum } ; it gives me access violation

Artist myArtist("blake", albums);
myArtist.PrintArtistInfo();
4

2 に答える 2

4
Playlist::Playlist(Song* _songlist) {
    numberOfSongs = sizeof(*_songlist)/sizeof(_songlist);  // <-- THIS
    ...

numberOfSongs 次の値に等しいため、予期しない(意味のない)値が割り当てられます。

numberOfSongs = sizeof(Song) / sizeof(Song*);

関数が動的に割り当てられた配列のサイズを知る必要がある場合は、このサイズを自分で追跡し、この関数に渡す必要があります。

また、C ++でプログラミングしているため、この言語が提供する機能を使用する必要があることにも注意してください。Cスタイルの文字列やCスタイルの配列の代わりstd::stringなどのSTLコンテナの代わりに使用する必要があります(の場合、オブジェクトはその長さに関する情報を内部的に保持するため、この種の問題に対処することはありません)。std::vectorstd::vector

于 2013-03-27T14:20:35.460 に答える
0

ここでの問題は、sizeof(*_songlist)/sizeof(_songlist);要素の配列を割り当てていることです。

つまり、Song割り当てるアイテムの数は、を格納するために使用Songされるバイト数を、(への)ポインタを格納するために使用されるバイト数で割ったものに等しくなりますSong。これはかなり無意味な値です。

さらに、この数は、渡した配列内の曲の数に依存しない定数値です。したがって、この関数を実行すると、渡される内容に関係なく、常に同じ量のメモリが割り当てられます。この数が実際に渡された曲の数よりも大きい場合は、配列の外部でインデックスを作成することになりますが、これは未定義の動作です。それはあなたのセグメンテーション違反を説明するでしょう。

一方、この定数よりも多くの曲を渡す場合は、割り当てた配列に適合する曲のサブセットで配列を初期化し、一部のデータが欠落します。この問題を解決するには、曲のstd :: vectorを渡すか、配列内の実際の曲数を含む引数を追加して、それを配列のサイズとして使用します。

于 2013-03-27T14:42:40.900 に答える