我想我弄乱了这些指针的作用域,c++
I think I am messing up the scope of these pointers, C++?
这是main/Initializer函数的简化版本。当我调用它时,它必须向玩家的发明者添加任何物品,我得到一个Debug Assertation Failed错误。
我觉得我好像把范围弄混了?
我是否在函数的作用域内声明了一些新的东西,然后无法在main中再次访问它?
我在函数内尝试了一些东西,比如使用getter/setter而不是完全赋值,比如p_player = p
,但我认为这实际上根本没有解决问题,我有点困惑。
int main()
{
Array<Item> items(3);
string itemsfilename = "itemsfile.txt";
Initializer::InitializeItems(items, itemsfilename);
Login login;
Player p1;
string filename = login.LoginToGame();
Initializer::InitializePlayer(p1, rooms, items, 3, filename);
}
void Initializer::InitializePlayer(Player& p_player, HashTable<string, Room>& p_rooms, Array<Item>& p_items, int p_numItems, std::string& p_filename)
{
ifstream playerfile(p_filename);
int inventorycount = 0;
//all the stuff needed to make a player
std::string name;
int health;
int confidence;
int humor;
int speed;
std::string room;
Room* currentRoom;
Inventory inventory(100);
//reading in values from file
for(int i = 0; i < inventorycount; i++)
{
playerfile.getline(value, 256);
std::string item(value);
for(int j = 0; j < p_numItems; j++)
{
if(p_items[j].GetName() == item)
{
inventory.AddItem(&(p_items[j])); //This line taken out, removes the error.
}
}
}
Player p(name, health, confidence, humor, speed, currentRoom, inventory);
p_player = p;
}
AddItem()接受一个指向一个项目的指针,然后将它附加到它的DLinkedList中。
编辑:
我得到的错误是
调试断言失败!
计划:打鼾声文件f: dd/vctools/crt_bld/self_x86/crt/src/dbgdel.cpp线:52
表达式:_Block_TYPE_IS_VALID(pHead->nBlockUse)
AddItem() Code:
bool AddItem(Item* p_item)
{
if(p_item->GetWeight() + m_weight <= m_maxWeight)
{
m_inventory.Append(p_item);
m_weight += p_item->GetWeight();
}
else
{
return false;
}
return true;
}
好的,所以我们仍然没有真正导致问题的代码,但我很确定我知道发生了什么,并且为了避免陷入"添加更多代码的20个问题"-有两种可能的情况:
- Items是一个对象数组,您可以在
m_inventory
容器中存储指向它们的指针。当销毁这个容器时,通过在项目上调用delete
来销毁对象-这不起作用,因为内容不是从堆中分配的。 - 当您复制
inventory
时,m_inventory
容器没有适当地复制,并且由于指向存储的指针失败,内容崩溃。
如果这没有帮助,那么请尝试减少你的代码到一些只显示这个问题的东西,不使用我们不知道内容的文件,可以作为一个完整的程序在问题中发布所有必要的代码[删除任何其他不需要的代码],所以我们可以看到一切。目前,我们只看到了一小部分代码,问题几乎可以肯定是直接在您展示给我们的代码中。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何在C++中访问作用域的变量输出?
- 重载时未在 C++ 的作用域错误中声明
- 作用域枚举和标准::get