将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?

  • 本文关键字:ptr 参数传递 函数 c++
  • 更新时间 :
  • 英文 :


在不良做法中,将指向对象 A 的指针作为函数的参数传递吗?

下面是一个示例:

class A
{
A** ptrToMyself;
void Foo(A*& refToPtrToMyself)
{
ptrToMyself = &refToPtrToMyself;
}
}
class B
{
A* ptrToA;
void Bar()
{
ptrToA = new A();
ptrToA->Foo(ptrToA);
}
}

我需要这个的原因是 B 将创建 A 的实例,然后 A 将运行并在以后销毁自身。由于我不想在 B 中使用无效指针,因此我将该指针设置为 nullptr。

编辑:

所以,正如一些人所问的那样,我将澄清我将使用它的目的。我正在UE4中制作游戏,基本上,A类代表我拥有的攻击类(我继承它并覆盖一些虚拟函数以添加功能(,B代表我的角色类。当玩家按下攻击按钮时,我会实例化玩家选择的攻击类别。然后攻击执行,播放动画并执行它必须做的所有事情。当它完成时,它只是摧毁自己(并清除角色对它的引用(。

将指针传递给实例根本没有意义——这已经是this指针了。

这里更大的问题是,你没有充分考虑对象生命周期的决定因素,更普遍地考虑潜在的异步性及其可能引发的冲突等。

异步动画基本上意味着您的动画类需要保存指向它们需要的所有对象的共享指针(攻击等(。这正是共享指针存在的原因;你可以在 B 的某个成员函数中初始化一个共享指针,在某个非阻塞动画函数中复制它,那么如果你去掉 B 持有的共享指针也没关系,只要某个动画对象持有指向它的指针,该对象就会存在。如果你的b对其他地方存在的ashared_ptr保持weak_ptrb可以跟踪a是否被摧毁。

无论如何,主要问题是你在哪里跟踪正在进行的动画?

你不需要攻击来删除自己。只需使用智能指针(std 或 UE4(并让它自行删除:

#include <memory>
#include <iostream>
class AttackInterface
{
public:
virtual void foo() = 0;
};
class Attack: public AttackInterface
{
public:
void foo() { std::cout << "deal damage" << std::endl;}
};
class Character
{
public:
void behave()
{
std::shared_ptr<Attack> attack = std::make_shared<Attack>();
attack->foo();
}
};
int main()
{
Character c;
c.behave();
}

最新更新