gpt4 book ai didi

c++ - 我创建的类似乎错误地设置了它的局部变量

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:20 24 4
gpt4 key购买 nike

很抱歉我在这个问题上缺乏经验,如果它是一个简单的答案,但我正在为一项任务编写一个 C++ 程序,并且无法在我的生活中找到解决方案。

我创建了一个名为 Door 的类,它拥有一个局部变量,用于存储它所连接的房间。此外,每扇门都通过另一个局部变量相互连接。记录每扇门相连的门的局部变量是一个指针(赋值要求)。

门类通过取消引用指针(通过 * 运算符)传回与其连接的门。

另一个类 Room 在四个方向(北、东等)之后的变量名称中存储了四个门,并由一个简单的整数标识,该整数可以通过函数传递以接收指向房间对象的共享指针.

我遇到的问题是在我的类(class)中负责创建房间并用门填充房间,然后将门彼此连接起来,该程序能够设置 Door 类的局部变量,但是,一旦刚刚设置变量的门对象被引用回它似乎设置了错误的变量。

在下面的示例中,正在创建的房间的整数是 1 和 2。

这不是完整的代码,只是相关信息的一小段

class Door{

private:
Door *_connectedDoor;
int _connectedRoom;
bool _isEntrance;
bool _isExit;
};

void Door::connectDoor(Door connectedDoor){

if( _isExit == true || _isEntrance == true)
{
std::cout << "Cannot connect, is an entrance / exit";
}

else
{
_connectedDoor = &connectedDoor;
}
};

Door Door::getConnectedDoor(){

return *_connectedDoor;
}

int Door::getRoom(){
std::cout << std::endl << "*** passing connected room:" << _connectedRoom << " ***" << std::endl;
return _connectedRoom;
};

void Door::setRoom(int room){

std::cout << std::endl << "*** setting connected room:" << room << " ***" << std::endl;
_connectedRoom = room;

};





class Room{
private:
int _id;
std::string _description;
Door _northDoor;
};

void Room::setNorth(Door north){
_isDoorNorth = true;
_northDoor = north;
std::cout << std::endl << "*** configuring doors room internally to:" << _id << " ***" << std::endl;
north.setRoom(_id);
};

类游戏

void Game::connectRooms(int room1, int room2, std::string startingDirection)
{
std::cout << std::endl << "*** connecting rooms ***" << std::endl;

std::shared_ptr<dungeon::Room> startingRoom = _currentDungeon.retrieveRoom(room1);
std::shared_ptr<dungeon::Room> endingRoom = _currentDungeon.retrieveRoom(room2);
dungeon::Door startingRoomDoor = *new dungeon::Door();
dungeon::Door endingRoomDoor = *new dungeon::Door();

std::cout << std::endl << "*** configuring room:" << startingRoom->id() << " ***" << std::endl;
std::cout << std::endl << "*** configuring room:" << endingRoom->id() << " ***" << std::endl;

startingRoom->setNorth(startingRoomDoor);
endingRoom->setSouth(endingRoomDoor);

std::cout << std::endl << "*** configuring doors room:" << startingRoomDoor.getRoom() << " ***" << std::endl;
std::cout << std::endl << "*** configuring doors room:" << endingRoomDoor.getRoom() << " ***" << std::endl;

startingRoomDoor.connectDoor(endingRoomDoor);
endingRoomDoor.connectDoor(startingRoomDoor);
};

输出:

*** connecting rooms ***

*** configuring room:1 ***

*** configuring room:2 ***

*** configuring doors room internally to:1 ***

*** setting connected room:1 ***

*** configuring doors room internally to:2 ***

*** setting connected room:2 ***

*** configuring doors room:
*** passing connected room:1835344 ***
1835344 ***

*** configuring doors room:
*** passing connected room:1835344 ***
1835344 ***

预期:

*** configuring doors room:
*** passing connected room:1 ***
1 ***

*** configuring doors room:
*** passing connected room:2 ***
2 ***

最佳答案

首先:很高兴看到您使用 std::shared_ptr!我认为你的问题是对象的复制。由于我不知道这只是一个错字还是什么,所以我会更详细地解释一下。让我们看一下您的一些代码:

dungeon::Door startingRoomDoor = *new dungeon::Door(); 这将执行以下操作:

  1. 使用 new 运算符创建 dungeon::Door 的新实例。这将返回指向新实例的指针。
  2. *取消引用这个指针。
  3. 用新实例初始化startingRoomDoor,从而调用复制构造函数并复制新实例。
  4. 指向新实例的指针超出范围,导致内存泄漏。

您可以像处理 startingRoomendingRoom 那样使用 std::shared_ptr 来解决这个问题。或者,您可以只编写 dungeon::Door startingRoomDoor; 并拥有一个 dungeon::Door 的初始化实例。在这种情况下,会自动调用构造函数。

接下来是您的房间功能:

void Room::setNorth(Door north){
_isDoorNorth = true;
_northDoor = north;
std::cout << std::endl << "*** configuring doors room internally to:" << _id << " ***" << std::endl;
north.setRoom(_id);
}

在这里,您通过 north 按值。这意味着,您传递给此函数的值实际上被复制了,并且在函数内部您只修改了 Room 的拷贝。在函数结束时 north 被销毁,因为它的作用域到此结束。你可以解决这个问题,如果你像这样通过引用传递:void Room::setNorth(Door &north) 现在你实际上修改了传递给函数的值而不是拷贝。

但是请注意! _northDoor = north; 行仍将复制 north。即使 north 是通过引用传递的。也许您只想存储一个指针而不是整个实例?您也可以为此使用 std::shared_ptr

关于c++ - 我创建的类似乎错误地设置了它的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58247725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com