У меня есть назначение C++, которое требует, чтобы я создал класс под названием " Tips
, который:
float taxRate
taxRate
для .65
, и конструктор один параметр, который устанавливает taxRate
к тому, что поплавок пользователь вводит в моей tipMain.cpp
файле.computeTip
, которая принимает два аргумента: totBill
и tipRate
, оба float
которые должны вычислять стоимость еды перед tipRate
, и возвращать наконечник на основе этого значения и желаемой скорости опроса.Моя проблема возникает, когда я пытаюсь использовать taxRate внутри функции computeTip.
Если я использую taxRate
, computeTip
не понимает значения taxRate
, заявляя, что он не определен, и даже если я tips::taxRate
, прежде чем я даже скомпилирую состояния Visual Studio
Ошибка: ссылка нестатического элемента должна быть относительно конкретного объекта.
Я смутно понимаю эту ошибку, но даже если я объявляю 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;
}
Ты используешь
float computeTip(float totBill, float tipRate)
Но это должно быть:
float Tips::computeTip(float totBill, float tipRate)
в реализации. Также вы должны скрыть свои данные.
Объявление метода и определение метода не имеют одинаковой сигнатуры. В вашем файле заголовка указывается, что computeTip
должен принимать 3 аргумента float
, но когда вы определяете его в файле.cpp, он принимает только два аргумента.
Это в дополнение к тому, что предлагают другие пользователи, префикс вашей функции с помощью Tips::
для указания того, что он является частью класса Tips
и, следовательно, должен иметь доступ к переменным-членам, таким как taxRate
.
Таким образом, ваше объявление заголовка должно выглядеть так:
float computeTips(float, float);
И ваше определение метода должно выглядеть так:
float Tips::computeTip(float totBill, float tipRate)
{
...
Вы не указали, что computeTip
- это метод Tips
. Измените его так:
float Tips::computeTip(float totBill, float tipRate)
{
float mealOnly = 0;
mealOnly = (totBill/taxRate);
return (mealOnly * tipRate);
}
И все должно быть хорошо.
Вы определяете computeTip()
как глобальную функцию, поэтому возможен только открытый статический computeTip()
доступ. Определите как float Tips::computeTip(float...)
и он должен скомпилироваться.