2010-05-05 113 views
0

爲什麼我在Windows中使用DevC++編譯代碼時遇到無效函數聲明,但是當我在Linux上的CodeBlocks中編譯它時,它工作正常。函數聲明無效。 DevC++

#include <iostream> 
#include <vector> 


using namespace std; 

//structure to hold item information 
struct item{ 
    string name; 
    double price; 
}; 

//define sandwich, chips, and drink 
struct item sandwich{"Sandwich", 3.00}; **** error is here ***** 
struct item chips{"Chips", 1.50};   **** error is here ***** 
struct item drink{"Large Drink", 2.00}; **** error is here ***** 

vector<item> cart;   //vector to hold the items 
double total = 0.0;   //total 
const double tax = 0.0825; //tax 

//gets item choice from user 
char getChoice(){ 

    cout << "Select an item:" << endl; 
    cout << "S: Sandwich. $3.00" << endl; 
    cout << "C: Chips. $1.50" << endl; 
    cout << "D: Drink. $2.00" << endl; 
    cout << "X: Cancel. Start over" << endl; 
    cout << "T: Total" << endl; 

    char choice; 
    cin >> choice; 
    return choice; 
} 

//displays current items in cart and total 
void displayCart(){ 
    cout << "\nCart:" << endl; 
    for(unsigned int i=0; i<cart.size(); i++){ 
     cout << cart.at(i).name << ". $" << cart.at(i).price << endl; 
    } 
    cout << "Total: $" << total << endl << endl; 
} 

//adds item to the cart 
void addItem(struct item bought){ 
    cart.push_back(bought); 
    total += bought.price; 
    displayCart(); 
} 

//displays the receipt, items, prices, subtotal, taxes, and total 
void displayReceipt(){ 

    cout << "\nReceipt:" << endl; 
    cout << "Items: " << cart.size() << endl; 
    for(unsigned int i=0; i<cart.size(); i++){ 
     cout << (i+1) << ". " << cart.at(i).name << ". $" << cart.at(i).price << endl; 
    } 
    cout << "----------------------------" << endl; 
    cout << "Subtotal: $" << total << endl; 

    double taxes = total*tax; 
    cout << "Tax: $" << taxes << endl; 

    cout << "Total: $" << (total + taxes) << endl; 


} 




int main(){ 

    //sentinel to stop the loop 
    bool stop = false; 
    char choice; 
    while (stop == false){ 

     choice = getChoice(); 

     //add sandwich 
     if(choice == 's' || choice == 'S'){ 
      addItem(sandwich); 
     } 
     //add chips 
     else if(choice == 'c' || choice == 'C'){ 
      addItem(chips); 
     } 
     //add drink 
     else if(choice == 'd' || choice == 'D'){ 
      addItem(drink); 
     } 
     //remove everything from cart 
     else if(choice == 'x' || choice == 'X'){ 
      cart.clear(); 
      total = 0.0; 
      cout << "\n***** Transcation Canceled *****\n" << endl; 
     } 
     //calcualte total 
     else if(choice == 't' || choice == 'T'){ 
      displayReceipt(); 
      stop = true; 
     } 
     //or wront item picked 
     else{ 
      cout << choice << " is not a valid choice. Try again\n" << endl; 
     } 

    }//end while loop 


    return 0; 
    //end of program 
} 

回答

1

你錯過了一個賦值操作符有:

struct item sandwich = {"Sandwich", 3.00}; 

注意,這是一個C語法雖然。你可能要說

item sandwich("Sandwich", 3.00); 

,並加入到item一個構造函數一個stringdouble

1

struct item sandwich{"Sandwich", 3.00};compound literal的用法,它在C(C99標準)中是合法的,但在C++中還不合法。但是,由於大多數C++編譯器都編譯C和C++代碼,因此有些人決定在C++中允許這樣的結構。大多數不會,不是沒有特殊的命令行參數。

因此,爲了這是合法和可移植的,你必須爲你的項目結構寫一個構造函數。這是很容易,但

struct item { 
    item(string const & name_, double price_) : name(name_), price(price_) {} 
    string name; 
    double price; 
}; 

現在你可以用

item sandwich("Sandwich", 3.00); 

附註:創建新項目 請注意,當在單個結構中具有不同含義的字段時,我會在複合文字中使用命名的初始值設定項,它只是更容易理解那是什麼。

struct item sandwich = {.name = "Sandwich", .price = 3.0}; 

這當然也不會在C++中起作用,但至少它看起來更好。

P.P.S. 原來我對C++ 0x沒有足夠的重視,在那裏它被稱爲initializer lists。似乎你不能命名它,這是一個恥辱。 因此,您的Linux編譯器不是在C++代碼中使用C99標準,而是無聲地使用了C++ 0x實驗標準。儘管如此,如果你想跨平臺的代碼,最好遠離那些奇特的特性,而使用普通的構造函數。

+0

大聲笑_「這不會奏效......但至少看起來更好」_ – wilhelmtell 2010-05-05 01:34:48

0

Dev-C++使用舊版本的MinGW編譯器。

:使用從支持的C++ 0x(特別是4.4系列的gcc)的擴展初始化列表特徵MinGW的項目的gcc較新的版本應該與關於被標記爲錯誤的行警告抱怨testing.cc:14:warning:extended 初始值設定項列表僅適用於 -std = C++ 0x或-std = gnu ++ 0x testing.cc:15:警告:擴展 初始值設定項列表僅適用於 -std = C++ 0x或-std = GNU ++ 0x中testing.cc:16:警告:擴展僅可 初始化列表 -std = C++ 0x或-std = GNU ++ 0x中

我的gcc 4.4.3版本無論如何都抱怨...不知道你的。

相關問題