C++ 我想我弄乱了这些指针的范围,C++;?
这是我的主/初始值设定项函数的简化版本。当我调用它并且它必须向players inventor添加任何项目时,我会得到一个Debug Assertation Failed错误 在我看来,我似乎有点混淆了范围?C++ 我想我弄乱了这些指针的范围,C++;?,c++,memory,scope,C++,Memory,Scope,这是我的主/初始值设定项函数的简化版本。当我调用它并且它必须向players inventor添加任何项目时,我会得到一个Debug Assertation Failed错误 在我看来,我似乎有点混淆了范围? 我是否在函数范围内声明了新的内容,然后又无法在main中再次访问它? 我在函数内部做了一些尝试,比如使用getter/setter而不是完全赋值,比如p_player=p,但我认为这根本不能解决问题,我有点困惑 int main() { Array<Item> item
我是否在函数范围内声明了新的内容,然后又无法在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;
}
intmain()
{
数组项(3);
字符串itemsfilename=“itemsfile.txt”;
初始值设定项::初始值设定项(items,itemsfilename);
登录;
玩家p1;
字符串文件名=login.LoginToGame();
初始化器::初始化层(p1,房间,项目,3,文件名);
}
无效初始值设定项::初始值设定层(播放器和p_播放器、哈希表和p_文件室、数组和p_项目、int p_numItems、std::字符串和p_文件名)
{
ifstream播放器文件(p_文件名);
int inventorycount=0;
//成为一名球员所需要的一切
std::字符串名;
国际卫生组织;
自信;
幽默;
整数速度;
标准:弦室;
房间*当前房间;
存货(100);
//从文件中读取值
for(int i=0;i
AddItem()获取指向项的指针,然后将其附加到其DLinkedList
编辑:我得到的错误是
调试断言失败 节目:zzz
文件f:\dd/vctools/crt_bld/self_x86/crt/src/dbgdel.cpp 电话号码:52 表达式:\块\类型\有效(pHead->nBlockUse) AddItem()代码:
bool AddItem(项目*p_项目)
{
如果(p_项目->GetWeight()+m_weight GetWeight();
}
其他的
{
返回false;
}
返回true;
}
好的,我们仍然没有真正导致问题的代码,但我非常确定我知道发生了什么,为了避免陷入“添加更多代码的20个问题”,有两种可能的情况:
m_inventory
容器中。销毁此容器时,通过调用Items上的delete
来销毁对象-这不起作用,因为未从堆中分配内容inventory
时,m_inventory
容器未被正确复制,并且由于指向存储的指针出现故障,内容会散开如果这没有帮助,那么请尝试将您的代码简化为仅显示此问题的代码,而不要使用我们不知道其内容的文件,并且可以将其作为问题中的完整程序发布,并提供所有必要的代码[删除任何其他不需要的代码],所以我们可以看到所有内容。目前,我们只看到了一些代码,问题几乎可以肯定直接出现在您向我们展示的代码中。它在哪一行断言?错误消息是什么?您的帖子中没有立即清楚。请解释“调试断言失败”更详细一点。错误消息是什么?什么断言失败了?什么测试使它失败了?因为
inventory.AddItem(…)
is(显然)导致问题的原因是,将这一行添加到您的问题中可能会有所帮助。因此,从我所知,这听起来像是#1?m#U清单使用内部双链接列表,析构函数使用delete itr
,其中itr是指向节点(包含项目指针)的指针正如您所说,首先使用m\u Array=new Datatype[p\u size]
创建对象数组,然后使用delete[]m_array;
。我不太确定之后会出现什么问题,也不知道如何解决。谢谢您,如果您使用的是delete itr;
,那么首先需要使用new
来创建对象。
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;
}