переменная не определена, но четко определена в моем конструкторе C ++

0

У меня есть назначение 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;
}
Теги:
static
lnk2019

4 ответа

3

Ты используешь

float computeTip(float totBill, float tipRate)

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

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

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

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

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

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

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

float computeTips(float, float);

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

float Tips::computeTip(float totBill, float tipRate)
{
...
0

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню