我最近一直在练习 C++,并且遇到了这个练习,我在对象引用方面遇到了一些困难。
这是我的代码:

#include "ClockUTC.h"

ClockUTC::ClockUTC()
{
    hour = 0;
    minute = 0;
}

ClockUTC::ClockUTC(int hour, int minute)
{
    this-> hour = hour;
    this-> minute = minute;
}

int ClockUTC::getHour()
{
    return hour;
}

int ClockUTC::getMinute()
{
    return minute;
}

void ClockUTC::setHour(int hour)
{
    this->hour = hour;
}

void ClockUTC::setMinute(int minute)
{
    this->minute = minute;
}
时钟UTC.cpp
#ifndef CLOCKUTC_H_INCLUDED
#define CLOCKUTC_H_INCLUDED


#include <iostream>


using namespace std;



class ClockUTC {

private:
int hour;
int minute;

public:
    ClockUTC();
    ClockUTC(int hour, int minute);
    int getHour();
    int getMinute();
    void setHour(int hour);
    void setMinute(int minute);
};


#endif // CLOCKUTC_H_INCLUDED
#ifndef CLOCKTZ_H_INCLUDED
#define CLOCKTZ_H_INCLUDED



#include <iostream>
#include "ClockUTC.h"


using namespace std;



class ClockTZ : public ClockUTC{

private:
ClockUTC clockUTC;
int offset;

public:
    ClockTZ(ClockUTC clockUTC, int offset);
    ClockUTC getClockUTC();
    int getOffset();
    void setClockUTC(ClockUTC clockUTC);
    void setOffset(int offset);
};




#endif // CLOCKTZ_H_INCLUDED
#include "ClockTZ.h"


 ClockTZ::ClockTZ(ClockUTC clockUTC, int offset)
{
    this->clockUTC = clockUTC;
    this->offset = offset;
    clockUTC.setHour(clockUTC.getHour() + offset);
}


ClockUTC ClockTZ::getClockUTC()
{
    return clockUTC;
}


int ClockTZ::getOffset()
{
    return offset;
}


void ClockTZ::setClockUTC(ClockUTC clockUTC)
{
    this->clockUTC = clockUTC;
}



void ClockTZ::setOffset(int offset)
{
    this->offset = offset;
}
这里的主文件是:
/**
   Unit tests for 2nd EOOP assignment.

   ClockUTC - aggregate 2 integers (hour, minute)
   ClockTZ - view for ClockUTC, store reference to clockUTZ and offset

   Note that this is in a big part "code reading" exercise.
   Based on this file you should implement two classes mentioned above,
   with proper interface, and in right header file.
 */

    #include "ClockTZ.h"
    #include <iostream>

    using namespace std;

    int main() {

        ClockUTC greenwich(9,17);
        ClockTZ warsaw(greenwich, 2);

        if (warsaw.getHour() != 11){
            cout << "Error in getHour() 1" <<  endl;
        }

        return 0;
    }
我已经对上述文件进行了编码,唯一的问题是在创建 ClockUTC 类并将其传递给 ClockTZ 之后,ClockUTC 重置并且它正在调用它的空构造函数并将小时设置为 0 而不是它的值 + 预期的偏移量。我知道这是因为该对象没有任何引用,并且它在传递或某事后立即被销毁,但似乎无法修复它。
可能问题在于 ClockTZ 有两个 ClockUTC 对象:一个基类和一个名为 clockUTC 的成员变量。 ClockTZ 构造函数将通过复制传入的值来初始化成员变量,并将默认初始化基类。当我稍后调用 getHour 时,会调用基类,返回默认值 0。
但在这种情况下我确实需要两者......

我尝试通过应用 & 引用来修复它,但似乎没有任何效果。有人可以帮我正确应用它吗?
这是我尝试过的:ClockUTC &clockUTC; 作为类成员(因此构造函数还必须将其 ClockUTC 参数作为引用,然后我使用 member-initializer-list 对其进行初始化。
如代码:

但这根本没有改变任何东西,我仍然得到相同的输出。请有人帮我让它工作!
更新:
int main() {

    ClockUTC greenwich(9,17);
    ClockTZ warsaw(greenwich, 2);


    if (warsaw.getHour() != 11)
        cout << "Error in getHour() 1  warsaw " << warsaw.getHour() <<  endl;

    greenwich.setHour(11);

    if (warsaw.getHour() != 13)
        cout << "Error in getHour() 2 warsaw " << warsaw.getHour() << endl;


    cout << "End of tests." << endl;
    return 0;
}
预期输出:11 然后是 13,但它总是 11。所以引用不起作用。
我的构造函数:
ClockTZ::ClockTZ(ClockUTC clockUTC, int offset)
       : ClockUTC{clockUTC}
{
      this->offset = offset;
      clockUTC.setHour(clockUTC.getHour() + offset);
}
现在输出将始终为 9

最佳答案

class ClockTZ : public ClockUTC{

private:
   ClockUTC clockUTC;

这是错误的。 ClockTZ 继承自 ClockUTC 。它不应将 ClockUTC 的另一个 实例作为类成员。除了从 ClockUTC 继承之外,这还会创建一个 重复的 实例 ClockUTC ,它是该类的私有(private)成员。完全删除这个 clockUTC 类成员。完全摆脱 clockUTC 声明。
ClockTZ::ClockTZ(ClockUTC clockUTC, int offset)
{
    this->clockUTC = clockUTC;

相反,子类构造函数应该正确构造其父类:
ClockTZ::ClockTZ(ClockUTC clockUTC, int offset)
       : ClockUTC{clockUTC}
{

就是这样(或者,如果您使用的是旧编译器,则可能是“ClockUTC(clockUTC)”)。



当然可以。您的子类从不调用父类的构造函数,而是构造子类的重复成员,该成员恰好与其父类相同。

你的 C++ 书应该有更多关于正确构造父类的信息和例子。

关于c++ - 对象在 c++ 中传递时重置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60902360/

10-11 20:20