2016-04-20 85 views
-1

这是我从中学习的C++书籍中的一个项目。'.getDrinkPrice'的左边必须有class/struct/union

我不断收到我曾尝试错误

"left of '.getDrinkPrice' must have class/struct/union" 

修复它,但我只是不停地搞乱进一步它。对于新用户来说,视觉工作室错误列表不太友好,这真的让我感到困扰。我显然不希望代码被重新固定,但我希望指出正确的方向。

#include <iostream> 
#include <string> 
#include <Windows.h> 

using namespace std; 

double wallet = 10.00; 
int change; 
bool isRunning; 
bool isChoosing; 
int userChoice; 
double pricePaid; 

class Soda { 
private: 
    string drinkName; 
    double drinkPrice; 
    int drinkAmt; 

public: 
    Soda() { 
     drinkName; 
     drinkPrice = .75; 
     drinkAmt = 20; 
    } 

    void setDrinkName(string name) { 
     drinkName = name; 
    } 

    string getDrinkName() { 
     return drinkName; 
    } 

    void setDrinkPrice(double price) { 
     drinkPrice = price; 
    } 

    double getDrinkPrice() { 
     return drinkPrice; 
    } 

    void setDrinkAmt(int amt) { 
     drinkAmt = amt; 
    } 

    void setNewDrinkAmount(int amt, int i) { 
     drinkAmt = amt - i; 
    } 

    int getDrinkAmt() { 
     return drinkAmt; 
    } 

}; 

// Declares classes 
Soda * Cola = new Soda; 
Soda * RootBeer = new Soda; 
Soda * LemonLime = new Soda; 
Soda * Grape = new Soda; 
Soda * Cream = new Soda; 
Soda *soda = new Soda; 

static void init() { 

// Pushes the Vending Machine data to the screen 
    cout << "Drink Name: " << " " << "Drink Cost: " << " " << "Number in machine: \n"; 

    cout << *Cola->getDrinkName << " " << *Cola->getDrinkPrice << " " << *Cola->getDrinkAmt <<endl; 

    cout << *RootBeer->getDrinkName << " " << *RootBeer->getDrinkPrice << " " << *RootBeer->getDrinkAmt << endl; 

    cout << *LemonLime->getDrinkName << " " << *LemonLime->getDrinkPrice << " " << *LemonLime->getDrinkAmt << endl; 

    cout << *Grape->getDrinkName << " " << *Grape->getDrinkPrice << " " << *Grape->getDrinkAmt << endl; 

    cout << *Cream->getDrinkName << " " << *Cream->getDrinkPrice << " " << *Cream->getDrinkAmt << endl; 

    cout << endl; 
    cout << "You have $" << wallet << endl; 
    cout << endl; 
} 

void checkValidPurchase(Soda soda, double w, double p) { 
    double priceOfDrink = soda.getDrinkPrice(); 
    int amountOfDrink = soda.getDrinkAmt; 

    // If there are enough drinks are in the machine 
    if (amountOfDrink > 0) { 

     // If user has enough money 
     if (w >= priceOfDrink) { 

      // If amount paid is greater than drink price 
      if (p > priceOfDrink) { 

       // Calculate price and change 
       w = w - p; 
       double getChange = p - priceOfDrink; 

       // Return Change 
       cout << "Paid " << p << " returning " << getChange << endl; 

       // Update amounts 
       int j = soda.getDrinkAmt; 
       soda.setNewDrinkAmount(j, 1); 
       w = w + getChange; 
      } 

      // If amount paid is equal to drink price 
      else if (p == priceOfDrink) { 

       // Calculate price 
       w = w - p; 
       cout << "Paid " << p << endl; 

       // Update amounts 
       int j = soda.getDrinkAmt; 
       soda.setNewDrinkAmount(j, 1); 
      } 

      // If amount paid is less than drink price 
      else if (p < priceOfDrink) { 

       // Prompt error and return to drink select 
       cout << "You did not enter enough money, returning to drink select. \n"; 
       Sleep(3000); 
      } 
     } 

     // If user does not have enough money 
     else { 
      cout << "Not enough money in wallet. \n"; 
      double amtNeeded = w + (w - priceOfDrink); 
      cout << "You have: " << w << " Needed for purchase: " << amtNeeded << endl; 
      Sleep(3000); 
     } 
    } 

    // If there are not enough drinks in machine 
    else { 
     cout << "Not enough of " << soda.getDrinkName << " in machine. \n"; 
     Sleep(3000); 
    } 

} 

void sodaMachine() { 

    // Starts the drink select loop 
    isChoosing = true; 

    while (isChoosing) { 

     // gets user input 
     cout << "Enter the number of the soda you would like: \n"; 
     cout << "Or to quit, press escape \n"; 

     switch (userChoice) { 
     case 1: 
      cout << "Dispensing Cola \n"; 
      cout << "Cost is .75 \n"; 
      cin >> pricePaid; 

      checkValidPurchase(*Cola, wallet, pricePaid); 
      isChoosing = false; 
      break; 

     case 2: 
      cout << "Dispensing Root Beer \n"; 
      cout << "Cost is .75 \n"; 
      cin >> pricePaid; 

      checkValidPurchase(*RootBeer, wallet, pricePaid); 
      isChoosing = false; 
      break; 

     case 3: 
      cout << "Dispensing Lemon Lime \n"; 
      cout << "Cost is .75 \n"; 
      cin >> pricePaid; 

      checkValidPurchase(*LemonLime, wallet, pricePaid); 
      isChoosing = false; 
      break; 

     case 4: 
      cout << "Dispensing Grape \n"; 
      cout << "Cost is .80 \n"; 
      cin >> pricePaid; 

      checkValidPurchase(*Grape, wallet, pricePaid); 
      isChoosing = false; 
      break; 

     case 5: 
      cout << "Dispensing Cream \n"; 
      cout << "Cost is .80 \n"; 
      cin >> pricePaid; 

      checkValidPurchase(*Cream, wallet, pricePaid); 
      isChoosing = false; 
      break; 

     case WM_CHAR: 

      if (GetAsyncKeyState(VK_ESCAPE)) { 
       cout << "Exiting program \n"; 
       isRunning = false; 
       break; 
      } 

     default: 
      isChoosing = false; 
      break; 
     } 

    } 
} 

int main() { 

    // Sets class values 
    Cola->setDrinkName("1. Cola"); 
    RootBeer->setDrinkName("2. RootBeer"); 
    LemonLime->setDrinkName("3. LemonLime"); 
    Grape->setDrinkName("4. Grape"); 
    Grape->setDrinkPrice(.80); 
    Cream->setDrinkName("5. Cream"); 
    Cream->setDrinkPrice(.80); 

    isRunning = true; 

    while (isRunning) { 

     // Run Program 
     init(); 
     sodaMachine(); 
     system("cls"); 

    } 

    return 0; 
} 
+0

为什么在调用'getDrinkXXX'方法之前解除引用指针?对于这个问题,你为什么不实际调用方法(即使用'getDrinkXXX()')?你可能想要'Cola-> getDrinkName()'而不是'* Cola-> getDrinkName'。 – callyalater

+1

你学会从简单的练习开始,到复杂的练习,这是非常重要的。如果你输入一个这样大的程序,其复杂程度远远超出你熟悉的范围,它可能会有错误 - 即使你从一个完全正确的源代码完全复制它,你也什么都不会学。 – Beta

+0

与“SYNTAX ERR”相比,Visual Studio的错误消息是天赐之物。可能会更好,但问题是错误信息必须处理一般性问题,所以很多时候他们无法准确解释出错。无论如何,你的语法相当混乱,编译器可能不够了解你告诉它给你一个好的错误信息。建议:在尝试构建和测试之前编写更少的代码。 – user4581301

回答

3

*Cola->getDrinkName是不正确的。

改为使用Cola->getDrinkName()(*Cola).getDrinkName();对于代码中所有其他相同类型的调用也是如此。

相关问题