Переменные-члены C++ не обновляются - Noob здесь

Я уже скрывался и просматривал здесь некоторое время, но это мой первый пост. Надеюсь, у меня есть правила и формат.

Я кодирую уже несколько месяцев, так что все еще довольно нов в этом. Прямо сейчас я пытаюсь реализовать очень простой класс парковочных счетчиков, имеющий только 2 функции. Один, чтобы вставить четверти, и один, чтобы проверить оставшееся время. Переменными-членами являются maxTime, rate и time.

Я получил некоторые функциональные возможности, но они продолжали давать мне странные результаты с моей функцией checkTime. Я проверил почти каждую строку и понял, что после выхода из конструктора введенные значения исчезают и заменяются действительно длинным числом. Я не могу понять, почему это происходит. Я не первый раз использую классы, конструкторы, создание объектов и тому подобное, и я не вижу, что я сделал по-другому на этот раз.

Может кто-нибудь из вас, эксперты, даст мне знать, где я облажался?

Вот мой заголовочный файл:

#ifndef PARKINGMETER_H_INCLUDED
#define PARKINGMETER_H_INCLUDED

#ifndef PARKINGMETER_H_INCLUDED
#define PARKINGMETER_H_INCLUDED

class ParkingMeter {
private:
    int maxTime;
    double time, rate;

public:
    ParkingMeter();
    ParkingMeter(int, double);
    ~ParkingMeter();
    void insertQtrs(int);
    double checkTime(double);
    double getTime();
    void setTime(double);

};

И вот моя реализация:

#include <iostream>
#include <stdexcept>
#include <ctime>
#include "ParkingMeter.h"

using namespace std;

ParkingMeter::ParkingMeter() {       //default constructer
    maxTime = 120;
    rate = .25;
    time = 0;
}

ParkingMeter::ParkingMeter (int maxTime, double rate) {       //constructor
    maxTime = maxTime;
    rate = rate;
    cout<<"maxTime is "<<maxTime<<endl;
    cout<<"rate is "<<rate<<endl;
}

ParkingMeter::~ParkingMeter(){      //destructor
}

void ParkingMeter:: insertQtrs(int quarters){
    ParkingMeter test(this->maxTime, this->rate);
    cout<<"maxTime is "<<test.maxTime<<endl;
    cout<<"rate is "<<test.rate<<endl;
    cout<<"You have inserted: "<<quarters<<" quarters."<<endl;
    double time = quarters * (rate * 60);
    if ( time > 120)
        time = 120;
    this ->setTime(time);

}

double ParkingMeter:: checkTime (double startTime){
    ParkingMeter test(this->maxTime, this->rate);
    double elapsed = clock() - startTime;
 //   test.maxTime = this->maxTime;
    cout<<"test: "<<test.maxTime<<endl;
    cout<<"elapsed time: "<<elapsed<<endl;
    cout<<"meter time: "<<time<<endl;
    cout <<"Your remaining time is: "<< (time - (elapsed / ((double)CLOCKS_PER_SEC)));
}

/*double ParkingMeter:: getTime (){
    int time = this-> maxTime;
    cout<<"time: "<<time<<endl;
    return time;
}*/

void ParkingMeter:: setTime (double time){
    this ->time = time;
}

int main () {
    double maxTime, rate;
    int quarters;
    char y;

    cout<<"Please enter the max parking time and rate, separated by a space: "<<endl;
    cin>>maxTime>>rate;
    ParkingMeter meter(maxTime, rate);
    cout<<"Please enter the amount of quarters you wish to enter: "<<endl;
    cin>>quarters;
    clock_t start = clock();
    meter.insertQtrs(quarters);
    cout<<"Please enter Y to check remaining time: "<<endl;
    cin>>y;

    if (y == 'y'){
       double startTime = start;
        cout<<"starttime: "<<startTime<<endl;
        meter.checkTime (startTime);
    }



}

1 ответ

Решение

Вот ваша проблема:

ParkingMeter::ParkingMeter (int maxTime, double rate) {       //constructor
   this->maxTime = maxTime;
   this->rate = rate;
// ^^^^^^ note this!

вы можете использовать список инициализатора, и в этом случае вы можете (и должны) удалить this->, Чтобы избежать проблем, я предлагаю вам использовать разные имена для переменных-членов, например, добавить _:

ParkingMeter::ParkingMeter (int maxTime, double rate)
    : maxTime_( maxTime ), rate_( rate )
{
    cout<<"maxTime is "<<maxTime_<<endl;
    cout<<"rate is "<<rate_<<endl;
}
Другие вопросы по тегам