インターフェイス 練習
test.csv cola, 10, COOL tea, 20, HOT water, 30, COOL
main.cpp // 自販機クラス #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> enum TEMPERATURE{ DRINK_COLD, DRINK_HOT, }; class IDrink { public: virtual TEMPERATURE GetType() = 0; virtual std::string GetName() = 0; virtual unsigned int GetMoney() = 0; }; class Drink : public IDrink{ public: Drink(std::string name, unsigned int money, TEMPERATURE type) : name_(name) , money_(money) , type_(type){} TEMPERATURE GetType(){ return type_; } std::string GetName(){ return name_; } unsigned int GetMoney(){ return money_; } private: std::string name_; unsigned int money_; TEMPERATURE type_; }; class Vending { public: Vending(std::vector<IDrink*> drink) : drink_(drink){} void Show(){ for (size_t i = 0; i < drink_.size(); ++i) { printf("this is %s\n", drink_[i]->GetName().c_str()); if(drink_[i]->GetType() == DRINK_HOT){ printf("HOT DRINK!\n"); }else if(drink_[i]->GetType() == DRINK_COLD){ printf("COLD_DRINK!\n"); } printf("Money is %dyen\n", drink_[i]->GetMoney()); printf("\n"); } } private: std::vector<IDrink*> drink_; }; class ReadCSV{ public: ReadCSV(const char* file): file_(file) { if(file_.fail()){ std::cout<<"failed."<<std::endl; return; } if(!Read()) return; Show(); } bool Read(){ std::string temp = ""; int pos = 0; while(std::getline(file_, temp)){ if((pos = temp.find("//") != temp.npos)) continue; std::vector<std::string> inner; while((pos = temp.find(",")) != temp.npos){ inner.push_back(temp.substr(0, pos)); // tempの中身は","の2文字を飛ばす temp = temp.substr(pos + 2); } inner.push_back(Trim(temp)); values_.push_back(inner); } return true; } std::string Trim(std::string line){ std::string temp; for(size_t i = 0; i < line.length(); ++i){ if(line[i] != ' '){ temp += line[i]; } } return temp; } void Show(){ for(size_t i = 0; i< values_.size(); ++i){ for (size_t j = 0; j < values_[i].size(); ++j) { std::cout<<values_[i][j]<<" "; } std::cout<<std::endl; } } std::vector<std::vector<std::string> > GetData(){ return values_; } private: std::ifstream file_; std::vector<std::vector<std::string> > values_; }; int main() { ReadCSV read("test.csv"); std::vector<std::vector<std::string> > data = read.GetData(); std::vector<Drink> drink; for (size_t i = 0; i < data.size(); ++i){ if(data[i].size() != 3) { printf("error %d", i); continue; } TEMPERATURE type = DRINK_COLD; if(data[i][2] == "HOT") { type = DRINK_HOT; } unsigned int money = atoi(data[i][1].c_str()); std::string name = data[i][0]; drink.push_back(Drink(name, money, type)); } std::vector<IDrink*> pDrink(drink.size()); for (size_t i = 0; i < drink.size(); ++i){ pDrink[i] = &drink[i]; } Vending v(pDrink); v.Show(); return 0; }
これは・・・
なんかすごいぐらいvector生成しまくってるwこれ絶対いろいろ間違ってる気がする。
メモ帳代わりに書き込んであるだけなので、もっと勉強してから直します。(たぶん)
http://jibun.atmarkit.co.jp/lskill01/rensai/imajava02/imajava01.html
この記事を読むのがめんどくさくなって適当に作りました。