C++ 成员变量未更新 - 新手在这里

Posted

技术标签:

【中文标题】C++ 成员变量未更新 - 新手在这里【英文标题】:C++ Member Variables not Updating - Noob here 【发布时间】:2013-09-15 14:45:13 【问题描述】:

我已经在这里潜伏和浏览了一段时间,但这是我第一次发帖。希望我已经掌握了规则和格式。

我已经编写了几个月的代码,所以在这方面还是很新的。现在,我正在尝试实现一个非常基本的停车计时器类,只有 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);
    




【问题讨论】:

自赋值只是你应该使用构造函数初始化列表的另一个原因。 对于初学者来说,checkTime 不会返回任何东西,即使它的签名表明它会返回。 加倍包含警卫并不会让它们变得更好!事实上,它应该阻止标题工作...... 总是需要在阅读后检查操作是否成功。也就是说,您想使用if (std::cin &gt;&gt; quarters) 并同样用于其他读取操作。 @DietmarKühl,你能澄清一下你所说的加倍包含警卫的意思吗? 【参考方案1】:

这是你的问题:

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

您可能想要使用初始化列表,在这种情况下您可以(并且必须)删除this-&gt;。为避免出现问题,我建议您为成员变量使用不同的名称,例如,添加_

ParkingMeter::ParkingMeter (int maxTime, double rate)
    : maxTime_( maxTime ), rate_( rate )

    cout<<"maxTime is "<<maxTime_<<endl;
    cout<<"rate is "<<rate_<<endl;

【讨论】:

K,我使用了初始化列表,这似乎解决了这个问题。不过,你能澄清一下为什么会这样吗?是因为变量名称相同吗? 另外,我不知道如何编辑我的原始问题,但我的 checkTime 函数给了我经过的秒数,我正在尝试几分钟。你能看出我哪里做错了吗? @D_S_B 是的,这是因为函数体中的名称相同。在初始化列表中,规则有点不同,因为被初始化的变量是 always 成员,只有用于初始化它的表达式才会查找参数名称。对于秒与分钟的问题:只需将值除以 60?如果这不是解决方案,那么我不明白这个问题。

以上是关于C++ 成员变量未更新 - 新手在这里的主要内容,如果未能解决你的问题,请参考以下文章

何时以及为何在堆 C++ 上声明成员变量

C++静态成员变量在内存中的存储方式

C++静态成员变量在内存中的存储方式

让公共成员变量访问 C++ 中同一类的私有成员

在 C++ 中查询类的静态成员变量

C++点滴----关于类常成员函数