我不确定如何标题,但基本上,我有这个类功能,旨在为类中的能力向量添加新的能力。
//Part of class Unit
public:
vector <Ability*> myAbilities;
void AddAbility(Ability * ability)
{
myAbilities.push_back(ability);
cout<<"Ability added"<<endl;
cout<<ability->GetName()<<endl;
ability = NULL;
delete ability;
}
我很确定参数中的指针在函数完成时基本消失,当我尝试在main函数中输出能力名称时,它不存在。我更喜欢使用这个函数:
AddAbility(new Fireball());
火球是一种能力的儿童类。
如何通过此函数向指向类的指针向量添加新功能?我很确定通过引用来做这件事是没有意义的,我有可能忘记一些基本的东西,但我似乎无法确定它。
答案 0 :(得分:2)
如果您正在使用C ++ 11进行编译,请考虑使用shared pointers,并让系统处理内存管理:
根据Casper Von B的评论,unique_ptr
似乎更适合您的特定情况(已更新):
std::vector<std::unique_ptr<Ability>> myAbilities;
void AddAbility(Ability * ability)
{
auto ptr = std::unique_ptr<Ability>(ability);
myAbilities.push_back(std::move(ptr));
cout << "Ability added" << endl;
cout << ability->GetName() << endl;
}
或者,你可以让Ability
完成所有的构建/破坏。通常,创建对象的类应该是销毁它的类。
此外,这:
ability = NULL;
delete ability;
..可能倒退了。当您执行清理时,请务必撤消该顺序:
delete ability;
ability = NULL;
答案 1 :(得分:0)
您删除了该功能(因此指针不再指向任何内容)。在能力向量中,你有这个指针现在不指向任何东西。 所以,不要取消和删除指针。能力破坏应该由Ability析构函数完成。
是的,指针被复制到向量中,类似于0x455ff930
,但请记住,当你删除它时,内存0x455ff930
的位置(指针所指向的位置)是与能力无关。