2013-11-27 1 views
0

У меня есть C++ задание, которое требует от меня, чтобы создать класс под названием Tips, что:переменная не определена, но четко определены в моем конструктор C++

  • имеет одну переменную-член, float taxRate
  • имеет два конструктора , значение по умолчанию, которое устанавливает taxRate в .65 и один конструктор параметров, который устанавливает taxRate в любой плавающий пользователь, который входит в мой файл tipMain.cpp.
  • имеет только одну функцию, computeTip, которая принимает два аргумента: totBill и tipRate, как float ые, которые должны рассчитать стоимость еды до уплаты налогов, и возвращающие наконечник на основе этого значения и желаемой скорости наконечника.

Эта проблема возникает, когда я пытаюсь использовать taxRate внутри функции computeTip.

Если я использую taxRate, computeTip не понимает значение taxRate, заявив, что не определено, и даже если я указать tips::taxRate, прежде чем я даже компилировать Визуальные состояния Студия

Error: a nonstatic member reference must be relative to a specific object.

Я смутно понимаю ошибка, но даже если я объявляю taxRate статичным в моем .h файле, я получаю ошибки LNK2019.

Tips.cpp

#include <iostream> 
#include <float.h> 
#include "Tips.h" 

using namespace std; 

Tips::Tips() 
{ 
    taxRate = 0.65; 
} 

Tips::Tips(float a) 
{ 
    taxRate = a; 
} 

float computeTip(float totBill, float tipRate) 
{ 
    float mealOnly = 0; 
    mealOnly = (totBill/taxRate);  //written both ways to show errors. taxRate undefined here. 
    mealOnly = (totBill/Tips::taxRate); //Error: a nonstatic member reference must be relative to a specific object 
    return (mealOnly * tipRate); 

} 

Tips.h

#ifndef Tips_H 
#define Tips_H 
#include <float.h> 

using namespace std; 

class Tips 
{ 
public: 
    Tips(); 
    Tips(float); 
    float computeTip(float, float, float); 
    float taxRate; 
}; 
#endif 

и мой tipMain.cpp

#include "Tips.h" 
#include <iostream> 
#include <iomanip> 


using namespace std; 

float tax; 
float meal; 
float tip; 
void tipProcessor(); 

int main() 
{ 
    char entry; 
    int toggle = 1; 
    cout << "Welcome to the Gratuity Calculator!" << endl; 
    cout << endl; 
    while (toggle != 0) 
    { 
     cout << "Enter 1 to calculate tip." << endl; 
     cout << endl; 
     cout << "Enter 2 to exit." << endl; 
     cout << endl; 
     cout << "Entry: "; 
     cin >> entry; 
     switch (entry) 
     { 
     case '1': 
      tipProcessor(); 
      break; 
     case '2': 
      toggle = 0; 
      break; 
     default: 
      cout << "Enter 1 or 2." << endl; 
      cout << endl; 
      break; 
     } 
    } 
    system("pause"); 
    return 0; 
} 
void tipProcessor() 
{ 
    cout << "Enter bill total: "; 
    cin >> meal; 
    cout << endl; 
    cout << "Enter tax rate: "; 
    cin >> tax; 
    cout << endl; 
    Tips thisTip(tax); 
    cout << "Enter tip percent: "; 
    cin >> tip; 
    cout << endl; 
    cout << "Tip is $" << setprecision(4) << thisTip.computeTip(meal, tip, thisTip.taxRate) << "." << endl; 
    cout << endl; 
} 

ответ

0

Вы определяете computeTip() как глобальная функция, поэтому только доступ общественности статический член возможно. Определите как float Tips::computeTip(float ...) и он должен скомпилировать.

3

используется

float computeTip(float totBill, float tipRate) 

Но это должно быть:

float Tips::computeTip(float totBill, float tipRate) 

в реализации. Также вы должны скрыть свои данные.

+0

Спасибо и всех тех, кто под вами! Я знал, что это будет что-то простое. Клянусь, я не особенный. – user3042535

0

Вы не указали, что computeTip - это метод Tips. Измените его так:

float Tips::computeTip(float totBill, float tipRate) 
{ 
    float mealOnly = 0; 
    mealOnly = (totBill/taxRate); 
    return (mealOnly * tipRate); 
} 

И все должно быть хорошо.

0

Объявление вашего метода и определение метода не имеют одинаковой сигнатуры. В вашем файле заголовка вы указываете, что computeTip должен принимать аргументы 3 float, но когда вы определяете его в файле .cpp, он принимает только два аргумента.

Это в дополнение к тому, что другие пользователи предполагают, предваряя вашу функцию с Tips::, чтобы указать, что он является частью Tips класса и, следовательно, должны быть в состоянии получить доступ к переменным-членам, таких как taxRate.

Таким образом, ваше объявление заголовок должен выглядеть следующим образом:

float computeTips(float, float); 

И ваше определение метод должен выглядеть

float Tips::computeTip(float totBill, float tipRate) 
{ 
... 
Смежные вопросы