2014-12-02 102 views
-2

我的函數output_all,add_item和remove_item都是從main.cc文件中得到這個錯誤。我錯過了什麼?我認爲這很簡單,但很明顯我搞砸了。我將在下面包含我的文件。預先感謝您的任何幫助!函數未在此範圍內聲明。我錯過了什麼?

main.cc

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include "basket.h" 
using namespace std; 


int main(){ 


int choice; 
string item; 

cout << "Would you like to: \n\n 1.See List \n 2.Add an Item \n 3.Remove an item \n 4.Exit \n\n Please Enter a number: "; 
cin >> choice; 

if (choice == 1){ 

output_all(cout); 

} 

else if (choice == 2){ 

cout << "Please enter the item you would like to add to the list: "; 
cin >> item; 
add_item(item); 

} 

else if (choice == 3){ 

cout << "Please enter the name of the item you would like to remove: "; 
cin >> item; 
remove_item(item); 
} 

else if (choice == 4){ 

exit(1); 

} 


else { 

main(); 

} 



return (0); 

} 

basket.h

#include <iostream> 
#include <string> 
using namespace std; 


class basket{ 

public: 
    //function will output all of the items currently in the list 
    void output_all(ostream& fout); 

    //Function will allow user to add item to list 
    void add_item(const string& item); 

    //function will remove item from list after checking that item exists in the list 
    void remove_item(const string& item); 

    // accessor method to access the string name 
    string get_name(); 


private: 

//string variable used for storing thr list 
string name; 

}; 

basket.cc

#include <iostream> 
#include <string> 
#include "basket.h" 
using namespace std; 



void basket::output_all(ostream& fout){ 

fout << name; 



} 


void basket::add_item(const string& item){ 

name = name + " " + item; 


} 


void basket::remove_item(const string& item){ 

int num = name.find(item); 

name.erase(num, item.length()); 
} 


string basket::get_name(){ 

return (name); 


} 
+3

您的函數是類中的方法(並且不是靜態的),所以您需要創建該類的實例並調用方法。他們不是免費的功能。 – 2014-12-02 18:46:16

回答

0

那麼,您所呼叫的功能,如output_alladd_itemremove_itemmain。程序中沒有這樣的功能。因此[明顯的]錯誤。

如果您嘗試調用basket類的成員函數,則應聲明basket類型的對象,並使用完全不同的語法(成員訪問語法)。你最喜歡的C++書會有很多解釋和例子。

順便說一句,在C++中手動調用main函數是非法的。您必須學會使用週期來實現您正在嘗試使用遞歸調用main所做的事情。

+0

爲什麼主呼叫是非法的?我會使用while循環嗎? – user2905256 2014-12-02 18:59:43

+0

啊......也作爲旁白,現在我的程序將運行,你有什麼想法爲什麼「名稱」不會保留它的價值?當我嘗試output_all函數時,「name」總是空的。我添加了代碼行,在刪除或添加任何內容後輸出列表,每添加一個新對象後每次只有一個名稱的單詞,並且當我嘗試刪除某些內容時,都沒有任何可刪除的內容!謝謝! – user2905256 2014-12-02 19:01:42

+0

@ user2905256:這是非法的,因爲語言規範說它是非法的。 'main'是特別的。舉一個例子,它可能會隱藏隱藏的序言和尾聲代碼,這些代碼不能被有意義地多次執行。 – AnT 2014-12-02 19:34:45

0

我可以看到output_all()add_item(),remove_item()basket類的非靜態成員。所以output_all(cout)應該從一個對象調用,如:basketObj.output_all(cout);