-1

私は C++ コードを書きましたが、問題はないようです。Code::Blocks を IDE として使用していますが、警告やエラーは表示されませんでしたが、実行すると、exe ファイルが応答していないことを示すボックスが表示されます。

私のコードは次のとおりです。

ヘッダー ファイル:

// DVD_App.h - Header File

#include <string>
#include <map>

using namespace std;

enum Status {ACTIVE, INACTIVE};

class Customer {
    private:
        string id;
        string name;
        string address;
        Status status;

    public:
        Customer (const string&, const string&, const Status);
        string &getId () { return id; }
};

class CustomerDB {
    private:
        static map<string, int> idList;

    public:
        static void addNewToIdList (const string &threeLetterOfName) {
            idList.insert(pair<string, int>(threeLetterOfName, 0));
        }

        static bool doesThreeLettersOfNameExist (const string &threeLetterOfName) {
            map<string, int>::iterator i = idList.find(threeLetterOfName);
            if ((i->first).compare(threeLetterOfName) != 0)
                return false;
            return true;
        }

        static int nextNumber (const string &threeLetterOfName) {
            map<string, int>::iterator i = idList.find(threeLetterOfName);
            ++(i->second);
            return i->second;
        }
};

ソースコード:

// DVD_App.cpp - C++ Source Code

#include <iostream>
#include <string>
#include "DVD_App.h"

using namespace std;

map<string, int> CustomerDB::idList;

Customer::Customer (const string &cName, const string &cAddress, const Status cStatus) : name(cName), address(cAddress), status(cStatus) {
    string threeLetters = name.substr(0, 3);
    if (CustomerDB::doesThreeLettersOfNameExist(threeLetters))
        threeLetters += "" + CustomerDB::nextNumber(threeLetters);
    else {
        CustomerDB::addNewToIdList(threeLetters);
        threeLetters += "0";
    }
}

int main () {
    Customer k ("khaled", "beirut", ACTIVE);
    cout << k.getId() << endl;

    return 0;
}

最初に CustomerDB クラスが機能していることを確認したいのですが、プログラムが実行されていないためできません。どんな助けでも大歓迎です。

4

2 に答える 2

2

あなたidListは最初は空なのでdoesThreeLettersOfNameExist、イテレータを呼び出すと、i返されるfind()イテレータend()は逆参照できない可能性があります。

于 2012-04-27T14:04:25.553 に答える
1

の場合、関数 doesThreeLettersOfNameExist をチェックインする必要がありますi == idList.end()。その場合はチェックできませんif ((i->first).compare(threeLetterOfName) != 0)。ちなみに、それは最初の繰り返しで起こります。これも nextNumber に追加します。

于 2012-04-27T14:04:37.657 に答える