我最近一直在练习 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/