在2个函数之间丢失的C++变量内容[untrue]

在2个函数之间丢失的C++变量内容[untrue],c++,C++,各位程序员好 我一直在努力学习不实引擎中的C++。我原以为我了解如何在类中正确跟踪时间,但遗憾的是,我的变量在两次函数调用之间的时间内将其内容更改为一个截然不同的数字 对于上下文,存在少量对象: 全球时间系统 此类负责管理时间并从时间观察者接收更新标记。这也是单身! 计时器 超级简单,只是我生成到世界中的一个Uobject,它可以从引擎接收更新标记并将其传递到全局时间系统 时间班 一节课,以举行时,分和秒。除此之外,如何使用它取决于使用该类的开发人员。在我的例子中,我只是简单地尝试存储它,并从这

各位程序员好

我一直在努力学习不实引擎中的C++。我原以为我了解如何在类中正确跟踪时间,但遗憾的是,我的变量在两次函数调用之间的时间内将其内容更改为一个截然不同的数字

对于上下文,存在少量对象:

全球时间系统 此类负责管理时间并从时间观察者接收更新标记。这也是单身! 计时器 超级简单,只是我生成到世界中的一个Uobject,它可以从引擎接收更新标记并将其传递到全局时间系统 时间班 一节课,以举行时,分和秒。除此之外,如何使用它取决于使用该类的开发人员。在我的例子中,我只是简单地尝试存储它,并从这一点上删除它的时间,以创建一个倒计时计时器。 我们有自己的小日志系统来帮助调试,主要是以我们喜欢的格式生成没有所有不真实内容的日志。此日志输出以下数据:

<Log, TimerSystem> [2] 2019.03.17-17.41.42: init attempt, init time should be: 23:6.0
<Log, TimerSystem> [3] 2019.03.17-17.41.42: init attempt succes, 23:6.0
<Log, TimerSystem> [6] 2019.03.17-17.41.42: Timer tick occured, lets see what our timer thinks about the time -225161083:32766:00
如果需要更多信息,我很乐意提供。谢谢你抽出时间

编辑:

我正在重载Time::operator=,如下所示:

Time & Time::operator=(Time & t)
{
    _seconds = t._seconds;
    _minutes = t._minutes;
    _hours = t._hours;
    return *this;
}
this->timeRemaining = Time(initialTime->GetHours(), initialTime->GetMinutes(), initialTime->GetSeconds());
并按如下方式使用:

Time & Time::operator=(Time & t)
{
    _seconds = t._seconds;
    _minutes = t._minutes;
    _hours = t._hours;
    return *this;
}
this->timeRemaining = Time(initialTime->GetHours(), initialTime->GetMinutes(), initialTime->GetSeconds());
但是,这会导致以下我不理解的编译器错误:

Path...\Private\GlobalTimerSystem.cpp(62) : error C4239: nonstandard extension used: 'argument': conversion from 'Time' to 'Time &'
在GlobalTimerSystem::InitTimerUWorld*,Time*中,执行以下操作:

Time* trPointer = new Time(initialTime->GetHours(),
                           initialTime->GetMinutes(),
                           initialTime->GetSeconds());
this->timeRemaining = trPointer;
这意味着:

在上创建一个Time类型的新对象,使用以下参数构造它,一旦它准备好,返回指向它Time*的指针,我将把它存储在局部变量trPointer中; 将指针trPointer的值分配给我的实例变量timeRemaining,该变量是类时间的一个实例,它是我们刚才在堆上分配和初始化的类时间实例的地址。 因此,一旦您到达GlobalTimerSystem::HandleTimerTick,这个->timeRemaining包含垃圾,当转换为字符串时,它仍然是垃圾,因此您看到的是-225161083:32766:00。此外,您现在在堆上为创建的时间实例分配的内存是浪费的,因为您永远不会释放它,甚至不会使用它

问题是,在这种情况下,您根本不需要堆

根据operator=的行为方式,您应该能够执行以下操作:

this->timeRemaining = Time(initialTime->GetHours(),
                           initialTime->GetMinutes(),
                           initialTime->GetSeconds());
它将创建一个临时时间实例,并使用传递的参数对其进行初始化,然后将其复制到实例变量timeRemaining中。如果这样做,您可能需要查看Time::operator=Time&&因为临时时间实例是一个右值。请注意,在这种情况下,我们不会泄漏内存,因为所有内容都是在上分配的,并且将在函数返回时释放

如果这不起作用,则意味着Time::operator=的行为不符合正确的复制运算符,应予以修复。另一种方法是手动设置剩余时间的小时、分钟和秒字段(如果它们是公共的、朋友的或更好的),以便使用诸如Time::set/*小时、分钟、秒*/之类的方法来允许您执行此操作->剩余时间->设置

最后,再次取决于时间的内部结构以及Time::operator=的编写方式,注意到initialTime本身就是一个Time*,甚至不需要临时中间时间实例,从而实现更简单、更可读的

this->timeRemaining = *initialTime;

作为结论,我认为您的问题来自于Time::operator=。

在分配this->timeRemaining=trPointer;中,是我忽略了什么,还是在globalTimeSystem::timeRemaining类型Time和trPointer类型Time*之间存在严重的类型不匹配;?但是我很困惑,因为这是编译器肯定会抱怨的事情…@PiCTo-Hmm是的,你的权利,那肯定是不正确的。我给它添加了一个引用,看看行为是否发生了变化。遗憾的是,这并不是错误所在。但是想得更远一点,我重载了=操作符来实现这一点。我已选择删除代码并保留解除限制。不过,在初始化my timer(应该是23:6.0)后,情况看起来更好了:*timeRemaining.ToString解析为*timeRemaining.ToString。所以你的剩余时间被转换成一个字符串,然后应用*,这可能会提取第一个字符。@RaymondChen我怀疑这是问题所在。我看到它在前几次运行中正常工作,我完全知道变量中的内容。@TDSrock A property operator=应该在这里取一个常量参数,t。无论如何,如果这是您的重载运算符=,它只做默认运算符=即浅拷贝,您不需要它。从更大的角度来看,你的设计似乎比它应该的更复杂:你想跟踪时间,最简单的方法就是使用一个计数器
. 对于秒,小时和分钟可以转换为秒。然后,根据C++中的当前能力,操作一个更容易出错的内置类型。您可以完全正确地知道,问题是我的超载=操作符。您是否有适当重载的=运算符的示例?我在网上找不到。至少我完全理解,谢谢你提供的内容丰富的帖子,这可能会引导我找到正确的答案;时间是你自己的课吗?如果不是,您确定有充分的理由重载Time::operator=?如果是的话,至少添加它的定义和operator=的实现会有所帮助。我现在将把它们添加到帖子中。时间是我自己的类,与虚幻分开。Unreal确实有一个类似于此的TimeCode类,但有一些限制,这迫使我创建自己的类。
this->timeRemaining = *initialTime;