2014-05-17 32 views
0

這是我的程序試圖搜索或顯示包含水果數量的整個地圖的代碼。C++地圖值傳遞

由於某種原因,搜索不起作用(沒有返回任何結果),並且代碼假設顯示所有數量僅返回地圖的最後一個條目。

以下是代碼的一些片段。

請忽略是否有更多的軟件包或語法錯誤,因爲我沒有將整個代碼複製到這裏。

編輯與錯字修正和添加的fruit.h

的fruit.txt

apple 
02 
orange 
06 
pear 
03 
lemon 
07 

它是從的main.cpp和提示輸入用於任務選擇讀取。

#include <string> 
#include <iostream> 
#include <vector> 
#include <fstream> 
#include <sstream> 
#include <cstdlib> 
#include <algorithm> 
#include "fruit.h" 

using namespace std; 

int main() 
{ 
    void readFile(); //read file  
    readFile(); 

    void perform(int); //case selection 
    int caseInput; 

    cout << "Press 1 for search" << endl; 
    cout << "Press 2 to show all" << endl; 
    cout << "choice: "; 

    cin >> caseInput; 
    perform(caseInput); 
} 

void readFile() //read line and pass to fruit.cpp using vector 
{ 
    vector<fruit> fruitVector; 
    string fruitName; 
    int quantity; 
    ifstream file; 
    txt.open("fruit.txt"); 
    while (!txt.eof()) 
    { 
     getline(txt, fruitName); 
     getline(txt, quantity); 
     fruitVector.push_back(fruit(fruitName, quantity)); 
    } 
    txt.close(); 
} 

void perform(int caseInput) 
{ 
    string searchTerm; 
    switch (caseInput) 
    { 
     case 1: // search function 
     { 
      cout << "input: "; 
      cin >> searchTerm; 
      taskOne(searchTerm); 
      break; 
     } 
     case 2: 
     { 
      tasktwo(); // not done yet, but nvm 
      break; 
     } 
    } 
} 

這是我fruit.cpp

#include <string> 
#include <map> 
#include <iostream> 
#include <cctype> 
#include "fruit.h" 

using namespace std; 

fruit::fruit(string fruitName, int quantity) 
{ 
    fruitMap[fruitName] = quantity; //storing vectors to map 
    passMap(fruitMap); //pass the map to task.cpp 
}; 

這是我task.cpp

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <map> 

using namespace std; 

map<string, int> fruitMap; 

void passMap(map<string, int>input) 
{ 
    fruitMap = input; 
} 
void taskOne(string searchTerm) 
{ 
    auto it = fruitMap.find(searchTerm); 
    if(it != fruitMap.end()) 
    { 
     cout << "output = " << endl; 
     cout << it->second << endl; // should print out the quantity of fruit 
    } 
    //in fact i try output the whole map using the code: 
    // 
    //for (auto it = fruitMap.begin(); it != fruitMap.end(); ++it) 
    //{ 
    // cout << it->first << " " << it->second << "\n"; 
    //} 
    // 
    //but it only output the last line which is: 
    //lemon 07 
} 

#include <string> 
#include <map> 
#include "task.h" 

class fruit{ 
private: 
    std::string fruitName; 
    std::int quantity; 
    std::map<std::string, int> fruitMap; 
public: 
    fruit(std:string, int); 
} 
+0

你可以顯示fruit.h的內容嗎? – 4pie0

+0

在'main'中,本地'caseInput'設置爲來自命令行的用戶輸入。但'caseNum'被傳遞給'perform'函數。某處有錯字嗎?在'readFile'中,'readFile'完成時,本地'fruitVector'實例不見了。這是你想要的嗎?既然你已經在'fruit'類裏面有一個'map'容器,然後爲每個水果實例調用'passMap',爲什麼不用'main'函數聲明一個本地的地圖實例呢?請在紙上畫一些圖片,瞭解所有這些容器如何相互關聯。你會找到更好的方法來實現該系統。 –

+0

fruit.h addded。 – user3647416

回答

0

每一個水果都有其自己的地圖fruit.h它存儲在哪裏。你需要一張普通的水果地圖。你可以通過將fruitMap設爲靜態來實現這一點,或者,甚至可以更好地將水果中的地圖與水果分離並通過對函數的引用