【发布时间】:2014-10-05 19:28:43
【问题描述】:
我有两节课。在主类中,我有一个逐步的过程,并且可以逐步进行,但我已将其实现为状态机。为了帮助保持机器简单/友好,我创建了另一个类,其中包含有关机器当前状态的信息。然后在主类中添加了对它的引用
CAnimateMachine *m_AniMach;
在一些动作发生后,我调用主类中的一个函数来实例化我的状态机对象中的变量。每次调用这个函数AniInit() 基本上都应该通过将变量实例化为“初始状态”来“重置”状态机。
我的问题是我不确定如何正确实例化我的m_AniMach。我习惯了 C# 我可以做的地方
m_AniMach = new CAnimateMachine();
“擦除”旧对象并实例化一个新对象。不过,从what I have read 开始,我在 C++ 中不能这么傲慢。在我的 init 方法中“重新实例化”这个变量的正确方法是什么?
我可以使用新的运算符m_AniMach = new CAnimateMachine(),然后在主类的解构器中执行delete &m_AniMach吗?
编辑: juanchopanza 的 回答对我来说很有意义。虽然我在尝试编译时不断收到错误消息。我不完全确定错误试图告诉我什么,我认为它告诉我我的课程不是公开的?我查看了C2248 MSDN 文章,但我看不出它与我的情况有何关系。
error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
include\afx.h(562) : see declaration of 'CObject::operator ='
include\afx.h(532) : see declaration of 'CObject'
occurred in the compiler generated function 'CAnimateMachine &CAnimateMachine::operator =(const CAnimateMachine &)'
这是我的CAnimateMachine 课程
class CAnimateMachine
{
public:
CAnimateMachine();
int startX,startY;
};
这就是我实例化它的方式
m_AniMach = CAnimateMachine();
以及它是如何定义的
CAnimateMachine m_AniMach;
【问题讨论】:
-
如果你必须使用指针(例如,多态),你可以使用
std::unique_ptr。分配新对象时,它将删除旧对象。 -
一开始就不要使用原始指针——你会给自己带来无尽的痛苦,尤其是来自带有 GC 的语言。理想情况下,请使用 juanchopanza 的答案,但即使您想使用指针,也应该使用智能指针。例如,
std::unique_ptr<CAnimateMachine> m_AniMach;和m_AniMach.reset(new CAnimateMachine);[编辑 - 被 @NeilKirk 击败] -
忘记你对 C# 的了解。 C++ 是一种非常不同的语言,在帮助您正确管理所有资源(不仅仅是内存)的生命周期方面做得更好。如果您使用 CObject 类并尝试在很多地方使用动态分配的对象,那么您就是在与该语言作斗争。获得一本好书,如Programming --Principles and Practice Using C++,了解 C++ 的工作方式。
-
我希望我有时间阅读一本关于我编写的每种编程语言的书,但它永远不会发生。