書店の在庫を追跡するアプリケーションを作成しています。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;
}