【问题标题】:Instantiating a new instance of a variable实例化变量的新实例
【发布时间】: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++ 的工作方式。
  • 我希望我有时间阅读一本关于我编写的每种编程语言的书,但它永远不会发生。

标签: c++ mfc


【解决方案1】:

似乎没有理由使用指针。你可以使用一个对象来代替:

CAnimateMachine m_AniMach;

在这种情况下,当保存它的类型的对象被实例化时,它将默认初始化。要“重新初始化”它,你可以说

m_AniMach = CAnimateMachine();

如果您这样做,您将不必担心following the rule of three 或其他动态分配陷阱。

【讨论】:

  • 这也比使用指针更安全,因为对象总是在作用域结束时被破坏,即使抛出异常。
  • @AnotherUser 这意味着CAnimateMachine 是不可分配的,所以你不能像我展示的那样“重新初始化”。您将需要找到另一种方法来做到这一点。如果不知道该课程的详细信息,我真的无能为力。
  • 嗯,我可能需要编写一个重载的= 运算符吗? // 上面给出了整个类CAnimateMAchine,如果有帮助的话?
  • @AnotherUser 该类定义与错误不匹配。您确定它不继承自CObject 或包含CObject?那是不可赋值的类型。
  • 啊,它确实包含引用 CObject 的内容。我在类中有两个指针,都指向其他两个类,它们都派生自CObject // 很抱歉听起来很需要/新手,但这意味着什么,它拥有一个Cobject 指针,为什么这有什么区别? // 我能做些什么来解决这个问题?
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2021-06-18
  • 2015-04-26
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多