我有3个对象,我们称之为Main
,Manager
& Item
。
Manager
需要有一个Items
数组。这些Items
已添加到Manager
对象的Main
。
我想知道我应该如何将Items
传递给Manager
,以便让它们在Main()函数范围之外生效,但与此同时,能够在Manager
被销毁时删除它们。
注意
Item
内部Manager
必须是指针,因为我需要检查NULL项
到目前为止,我有类似的东西(不是实际的代码):
Main
{
Manager* Man;
Main()
{
Man = new Manager(/**/); //i use a pointer because i need this object to persist;
Item* it = new Item(/**/);
Man->AddItem(it);
}
~Main()
{
delete(Man);
}
}
Manager
{
Item* ItemArchive[15];
void AddItem(Item* item)
{
ItemArchive[index] = item;
}
~Manager()
{
for(int i=0;i<archiveLength;i++)
delete(ItemArchive[i]); //Here i get a runtime error,most probably an
//access violation,can't be more specific
//because Unreal Engine doesn't give me that info
}
}
Item
{
//just a basic object
}
所以我的问题是,如何在Main
中创建对象,然后才能在Manager
内使用和删除它们?
答案 0 :(得分:4)
考虑使用std::unique_ptr<Item>
并将所有权从Main
传递给Manager
:
#include <vector>
#include <memory>
class Item {};
class Manager {
std::vector<std::unique_ptr<Item>> item_archive;
public:
void addItem(std::unique_ptr<Item> item){
item_archive.push_back(std::move(item));
}
};
int main() {
Manager manager;
auto item = std::make_unique<Item>(); // C++14
//auto item = std::unique_ptr<Item>(new Item); // C++11
manager.addItem(std::move(item));
}
这样,当Manager
被销毁而不必编写析构函数时,将删除这些项目。
我建议使用std::vector
而不是数组,因为它简化了项目档案的管理。
由于您没有发布实际代码,但是使用std::vector
和std::unique_ptr
而非极有可能解决问题,因此无法确定究竟是什么给您带来运行时错误。
答案 1 :(得分:-1)
没有理由不允许Manager
删除Item
。您的错误可能是您超出了ItemArchive
数组或删除了两次对象?自从你重新编写了问题的代码之后,很难说清楚。
我会说尝试使用你可以调试的系统,然后你会学得更快!调试器只是令人惊奇的事情。