0

//手短に言うと、メディア ライブラリを作成しようとしていますが、このデータを機能させることができない理由が 100% わかりません。これは私の Main.cpp です

#include "CDclass.h"

bool fills = true;//Public Switch to turn on/off autofill of "Data" classes.
bool runner = true;//Public switch that helps with the program functionality(DO NOT EDIT)

void main()
{
int decision;
unsigned int total = 5;
vector<string> titles;
vector<double> time;
string artist;
string name;

titles.resize(total);
time.resize(total);

vector<cdStorage> Data;//A vector of classes

cdStorage newCD;
Data.push_back(newCD);
Data.push_back(newCD);
Data.push_back(newCD);//This was used as a sizing test and it works.
cdStorage::cdStorage(total);

   //I used this to loop without restarting main.

while(runner == true)
{
    if(fills == true)//Autofill to get the program running
    {
        artist = "Bunny";
        name = "Bread";

        for(unsigned int x = 0; x < Data.size(); x++)
        {
            cdStorage::cdStorage(total);
            Data[x].setNewArtist(artist);
            Data[x].setNewName(name);

            for(unsigned int y = 0; y < total; y++)
            {
                titles[y] = "TestfieldBanana!";
                time[y] = 12.13;
                Data[x].setNewTitles(y, titles[y]);
                Data[x].setNewTime(y, time[y]);
            }
        }
        fills = false;
    }

    cout << Data[0].getNewArtist() << endl;
    cout << "*******************" << endl <<
            "*Media Awesomsauce*" << endl <<
            "*******************" << "\n\n" <<
            "********************" << endl <<
            "* 1: Check Library *" << endl <<
            "* 2: Add CD        *" << endl <<
            "* 3: Delete CD     *" << endl <<
            "* 4: Exit Program  *" << endl <<
            "********************" << "\n\n" <<
            "Decision:_";

    cin >> decision;
 //The majority of all of this is very self explanatory. 
    if(decision == 1)
    {
        for(unsigned int x = 0; x < Data.size(); x++)
        {
            cdStorage::cdStorage(total);
                cout << Data[x].getNewName() << "\t";
                cout << Data[x].getNewArtist() << "\t";
            for(unsigned int y = 0; y < total; y++)
            {   
                //int length = Data[x].getNewName().length();

                cout << "\t\t\t" << Data[x].getNewTitles(y);
                cout << "\t" << Data[x].getNewTime(y) << endl;
            }
        }

    }else if(decision == 2)
    {
        Data.push_back(newCD);

        system("CLS");

        cout << "What is the name of the CD: ";
        cin >> name;
        cout << "\nWhat is the name of the Artist: ";
        cin >> artist;
        cout << "\nHow many songs are there: ";
        cin >> total;

        cdStorage::cdStorage(total);
        titles.resize(total);
        time.resize(total);
        Data[Data.size()].setNewName(name);
        Data[Data.size()].setNewArtist(artist);

        cout << "What are the song titles and lengths:\n";

        for(unsigned int x = 0; x < total; x++)
        {
            cout << "Title " << x+1 << ": ";
            getline (cin, titles[x]);
            cout << "Length(Example: 3.36 for 3 mins and 36 seconds): ";
            cin >> time[x];
            cout << endl;

            Data[Data.size()].setNewTitles(x, titles[x]);
            Data[Data.size()].setNewTime(x, time[x]);
        }

    }else if(decision == 3)
    {

    }else if(decision == 4)
    {
        runner = false;

    }else
    {
        system("CLS");
        cout << "Error: You must choose a number between 1-5...\n\n";
        system("pause");
        system("CLS");
    }
  }
}

//これは私の CDWorks.cpp です

#include "CDclass.h"

//Constructor
cdStorage::cdStorage(){};
//Overloaded Constructor
cdStorage::cdStorage(unsigned int theTotal)
{
newTotal = theTotal;
newTitles.resize(newTotal);
newTime.resize(newTotal);
}
//Accessors
unsigned int cdStorage::getNewTotal() const
{
    return newTotal;
}

string cdStorage::getNewTitles(unsigned int x) const
{
    return newTitles[x];
}

double cdStorage::getNewTime(unsigned int x) const
{
    return newTime[x];
}

string cdStorage::getNewArtist() const
{
    return newArtist;
}

string cdStorage::getNewName() const
{
    return newName;
}

//Mutators
void cdStorage::setNewTotal(unsigned int theTotal)
{
    newTotal = theTotal;
}

void cdStorage::setNewTitles(unsigned int x, string theTitle)
{
    newTitles[x] = theTitle;
}

void cdStorage::setNewTime(unsigned int x, double theTime)
{
    newTime[x] = theTime;
}

void cdStorage::setNewArtist(string theArtist)
{
    newArtist = theArtist;
}

void cdStorage::setNewName(string theName)
{
    newName = theName;
}
//Destructor
cdStorage::~cdStorage(){}

//これは私の CDClass.h です

#include <iostream>
#include <string>
#include <vector>

using namespace std;

#ifndef CDCLASS_H
#define CDCLASS_H

class cdStorage
{
private:
unsigned int newTotal;
vector<string> newTitles;
vector<double> newTime;
string newArtist;
string newName;

public:
//Constructor
cdStorage();
//Overloaded Constructor
cdStorage(unsigned int);
//Destructor
~cdStorage();
//Accessors
unsigned int getNewTotal() const;
string getNewTitles(unsigned int) const;//The integer is to track which element needs returned.
double getNewTime(unsigned int) const;
string getNewArtist() const;
string getNewName() const;
//Mutators
void setNewTotal(unsigned int);
void setNewTitles(unsigned int, string);
void setNewTime(unsigned int, double);
void setNewArtist(string);
void setNewName(string);
};

#endif
4

2 に答える 2

1
    Data[Data.size()].setNewName(name);

これは、ベクトルの末尾を超えてアクセスしData.size()、ゼロから始まる要素のみを持ちます。 これは未定義の動作であり、おそらく問題を引き起こしています。

問題ではないかもしれませんが、エラーが発生した場所を言っていないので、わかりにくいです。あなたは失敗したプログラムを持っています。あなたはそれをデバッグし、どこで爆発したかを言うことができるはずです.デバッガの使い方を学ぶのに 3 日間かかりました!

何をしているのかがわかるまでは、ベクトルへのアクセスに使用するのをやめ、関数の[x]使用に切り替えることをお勧めします。これは同じことを行いますが、有効なインデックスであり、ベクトルのサイズより大きくないことを確認します。そうすれば、未定義の動作やスタック オーバーフローの代わりに、最初の問題で例外が発生します。at(x)x

他にも色々と問題が…。

インクルード ガードは、他のヘッダーの後ではなく、ファイルの先頭に配置します。

using namespaceヘッダーの名前空間スコープに置かないでください。

あなたはこれを続けます:

cdStorage::cdStorage(total);

それは何をすることになっていて、なぜあなたはそれを続けているのですか?

コンストラクター本体でメンバー初期化子を変更するのではなく、コンストラクターでメンバー初期化子を使用する必要があります。

cdStorage::cdStorage(unsigned int theTotal)
{
newTotal = theTotal;
newTitles.resize(newTotal);
newTime.resize(newTotal);
}

つまり、代わりにこれを行います:

cdStorage::cdStorage(unsigned int theTotal)
: newTotal(theTotal), newTitles(theTotal), newTime(theTotal)
{ }
于 2013-05-18T20:25:47.523 に答える