-1

書店の在庫を追跡するアプリケーションを作成しています。mainへの引数として情報を含むテキストファイルへのファイルパスを取得します。私が抱えている問題は、Itemオブジェクトを格納するために使用しているクラス状態ベクトルインベントリの要素にアクセスしようとするたびに発生するようです。最初はクラスヘッダー、次にメソッド定義、そしてメインです。前もって感謝します。

    #ifndef _BOOKSTORE_H_
    #define _BOOKSTORE_H_

    #include <vector>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    #include <stdlib.h>

    #include "Item.h"
    #include "Paperback.h"
    #include "Hardcover.h"
    #include "Audiobook.h"
    #include "Ebook.h"

    using namespace std;

    class Bookstore {

    //States
    private:
        vector<Item*> inventory;
    //Behaviors
    public: 
        Bookstore();
        void loadInventory(const char*);
        void searchInventory(string);
        unsigned int inventorySize();
        void printInventory();
        vector<string> split(string);

    };

    #endif


    #include "Bookstore.h"

    Bookstore::Bookstore() {}

    void Bookstore::loadInventory(const char* filepath) {

        string ty = "";
        string ti = "";
        string au = "";
        string pri = "";
        string f = "";
        string cd = "";
        string pro = "";

        string line;
        ifstream ifs;
        ifs.open (filepath);

        if (ifs.is_open()) {
            while (ifs.good()) {
                ty = "";
                ti = "";
                au = "";
                pri = "";
                f = "";
                cd = "";
                pro = "";

                getline(ifs, line);

                if (line.compare("Paperback") == 0) {
                    ty = "Paperback";
                    getline(ifs, line);
                    ti = line;
                    getline(ifs, line);
                    au = line;
                    getline(ifs, line);
                    pri = line;
                    Paperback p(ty, ti, au, pri);
                    inventory.push_back(&p);
                }

                if (line.compare("Hardcover") == 0) {
                    ty = "Hardcover";
                    getline(ifs, line);
                    ti = line;
                    getline(ifs, line);
                    au = line;
                    getline(ifs, line);
                    pri = line;
                    getline(ifs, line);
                    f = line;
                    Hardcover h(ty, ti, au, pri, f);
                    inventory.push_back(&h);
                }

                if (line.compare("Audio") == 0) {
                    ty = "Audio";
                    getline(ifs, line);
                    ti = line;
                    getline(ifs, line);
                    au = line;
                    getline(ifs, line);
                    pri = line;
                    getline(ifs, line);
                    cd = line;
                    Audiobook a(ty, ti, au, pri, cd);
                    inventory.push_back(&a);
                }

                if (line.compare("Electronic") == 0) {
                    ty = "Electronic";
                    getline(ifs, line);
                    ti = line;
                    getline(ifs, line);
                    au = line;
                    getline(ifs, line);
                    pri = line;
                    getline(ifs, line);
                    pro = line;
                    Ebook e(ty, ti, au, pri, pro);
                    inventory.push_back(&e);            
                }

            }
        }

        ifs.close();
        cout << inventory.size() << endl;

        for (unsigned int i=0; i<inventory.size(); i++) {
            inventory.at(i)->printItem();
        }
    }

    void Bookstore::searchInventory(string query) {

        vector<string> searchStr;
        int count;
        string currentStr;

            for (unsigned int i=0; i<inventory.size(); i++) {

                    currentStr = inventory.at(i)->getTitle();
                    searchStr = split(currentStr);

                    for(unsigned int j = 0; j < searchStr.size(); j++) {
                        if (searchStr[j].compare(query)==0) {
                            inventory.at(i)->printItem();
                            count++;
                        }
                    }

                    currentStr = inventory.at(i)->getAuthor();
                    searchStr = split(currentStr);

                    for(unsigned int j = 0; j < searchStr.size(); j++) {
                        if (searchStr[j].compare(query)==0) {
                            inventory.at(i)->printItem();
                            count++;
                        }
                    }

                    if ((i==(inventory.size()-1))&&(count==0)) {
                        cout << "Sorry, no matching results were found." << endl;
                    } else if ((i==(inventory.size()-1))&&(count!=0)) {
                        cout << "Query complete." << endl;
                    }
            }
    }

    unsigned int Bookstore::inventorySize() {
        unsigned int num = inventory.size();
        return num;
    }

    void Bookstore::printInventory() {
        for (unsigned int i = 0; i < inventory.size(); i++) {
            inventory.at(i)->printItem();       
        }

    }

    vector<string> Bookstore::split(string s) {
        vector<string> pieces;
        istringstream iss(s);
        copy(istream_iterator<string>(iss), istream_iterator<string>(),
            back_inserter<vector<string> >(pieces));

        return pieces;
    }

    #include "Bookstore.h"

    int main(int argc, char** argv) {

        Bookstore current;

        if (argc==2) {
            current.loadInventory(argv[1]);
        }

        cout << current.inventorySize() << endl;

        //Initialize variables
        char status = 'R';
        string input = "";
        int iter = 1;

        //Run application until quit
        while (status=='R') {

            //Provide menu
            if (iter==1) {
                cout << "Welcome to Bookstore Inventory 9000." << endl;
            }

            if (current.inventorySize()==0) {
                    cout << "There are no entries!" << endl;
                    status = 'Q';
            } else {

                cout << "Would you like to (V)iew all, (S)earch, or (Q)uit?" << endl;

                getline(cin, input);

                if (input.compare("V")==0) {
                    current.printInventory();       
                } else if (input.compare("S")==0) {
                    cout << endl;
                    cout << "What are you looking for?" << endl;
                    getline(cin, input);
                    current.searchInventory(input);
                    cout << endl;
                } else if (input.compare("Q")==0) {
                    status = 'Q';
                    cout << "Thank you for perusing our inventory. Goodbye." << endl;
                } else {
                    cout << endl;
                    cout << "This is not a valid choice. Please try again." << endl;
                    cout << endl;
                }
            }

            iter++;

        }

    return -1;

    }
4

1 に答える 1

1

あなたの問題はありませんat()。あなたの問題は、アドレスをローカル変数に保存していて、後でローカル変数が存在しなくても、そのポインターを使用していることです。

具体的にはloadInventory、以下に 1 つの例を示します。

 if (line.compare("Paperback") == 0) {
                ty = "Paperback";
                getline(ifs, line);
                ti = line;
                getline(ifs, line);
                au = line;
                getline(ifs, line);
                pri = line;
                Paperback p(ty, ti, au, pri);
                inventory.push_back(&p);
            }

最後から 2 番目の行で、"p" という名前のローカル (スタック) 変数を作成する方法に注意してください。最後の行で、そのローカル変数のアドレスを取得して保存します。コードが上記の引用符の最後の中括弧に当たると、「p」という名前の変数がなくなり、ベクトル内のそのポインターはもう役に立たなくなります。

可能な解決策の 1 つは、動的に割り当てることです。

Paperback* p = new Paperback(ty, ti, au, pri);
inventory.push_back(p);

inventoryこれを行う場合、ベクトルが完成したら、それらのポインターを自分で削除する必要があることに注意してください。

于 2012-10-01T03:12:32.723 に答える