LNK2019错误;此处缺少/未定义的内容
LNK2019 error; what is missing/not defined here?
当我尝试构建我的程序时,出现此错误:
error LNK2019: unresolved external symbol "bool __cdecl TextGame::spaceVoid(struct TextGame::Position const &,struct TextGame::RoomData const &)" (?spaceVoid@TextGame@@YA_NABUPosition@1@ABURoomData@1@@Z) referenced in function "void __cdecl TextGame::UpdateGame(struct TextGame::PlayerState &,struct TextGame::WorldState &)" (?UpdateGame@TextGame@@YAXAAUPlayerState@1@AAUWorldState@1@@Z)
这是针对基本的 ASCII 地牢爬行器。我是一个相对新手,正在上大学课。现在我们只是跟随一个视频 1 对 1,所以我不完全确定错误在哪里。显然,它似乎想要定义一些关于位置(房间中对象的坐标(和房间数据(房间的属性(的东西。但我不知道到底是什么。抱歉,我不能更具体 - 如果我可以提供额外的信息,请告诉我。
namespace TextGame
{
RoomData CreateRoom(const std::string& inName, const std::string& inDescription)
{
RoomData room = {};
room.Name = inName;
room.Description = inDescription;
return room;
}
void InitializeGame(PlayerState& playerState, WorldState& worldState)
{
printf("Welcome to...n");
printf("A GAME by SOMEONEnn");
printf("TELL THE PLAYER THE GOAL OF THE GAMEnn");
playerState.WantsDescription = true;
playerState.CurrentRoomIndex = 0;
playerState.CurrentPosition.X = 3;
playerState.CurrentPosition.Y = 4;
worldState.Rooms.clear();
// 0
{
RoomData room = CreateRoom("ROOM NAME", "ROOM DESCRIPTION");
room.RoomMapWidth = 10;
room.RoomPosition = { 0, 0 };
room.RoomMap =
"####.#####"
"#........#"
"#........#"
"#........."
"#........."
"#........#"
"#........#"
"##########";
room.Inventory.push_back({ ItemType_Key, {5,3} });
room.Inventory.push_back({ ItemType_Sword, {7,5} });
room.LockedDoors.push_back({ {4, 0} });
worldState.Rooms.push_back(room);
}
// 1
{
RoomData room = CreateRoom("ROOM NAME 1", "ROOM DESCRIPTION 1");
room.RoomMapWidth = 10;
room.RoomPosition = { 1, 0 };
room.RoomMap =
"##########"
"#........#"
"#........#"
".........#"
".........#"
"#........#"
"#........#"
"##########";
worldState.Rooms.push_back(room);
}
// 2
{
RoomData room = CreateRoom("ROOM NAME 2", "ROOM DESCRIPTION 2");
room.RoomMapWidth = 10;
room.RoomPosition = { 0, -1 };
room.RoomMap =
"####.#####"
"#........#"
"#........#"
"#........#"
"#........#"
"#........#"
"#........#"
"####..####";
worldState.Rooms.push_back(room);
}
// 3
{
RoomData room = CreateRoom("ROOM NAME 3", "ROOM DESCRIPTION 3");
room.RoomMapWidth = 10;
room.RoomPosition = { 0, -2 };
room.RoomMap =
"####..####"
"#........#"
"#........#"
"#........#"
"#........#"
"#........#"
"#........#"
"####..####";
worldState.Rooms.push_back(room);
}
// 4
{
RoomData room = CreateRoom("ROOM NAME 4", "ROOM DESCRIPTION 4");
room.RoomMapWidth = 10;
room.RoomPosition = { 0, -3 };
room.RoomMap =
"##########"
"#....A...#"
"#........#"
"#........#"
"#........#"
"#........#"
"#........#"
"####..####";
worldState.Rooms.push_back(room);
}
}
void GetInput(PlayerState& playerState, const WorldState& worldState)
{
playerState.WantsToExit = false;
playerState.WantsDescription = false;
playerState.WantsInventoryListed = false;
playerState.DesiredPosition = playerState.CurrentPosition;
playerState.WantsToGet = false;
//playerState.Inventory.push_back({ ItemType_Key, Position() });
//playerState.Inventory.push_back({ ItemType_Sword, Position() });
//playerState.Inventory.push_back({ ItemType_Key, Position() });
printf("What do you do?n");
printf("> ");
TextAdventureCommand command = ParseAdventureCommand();
if (command.Verb == "quit")
{
playerState.WantsToExit = true;
}
else if (command.Verb == "north" || command.Verb == "w")
{
playerState.DesiredPosition.Y = playerState.DesiredPosition.Y - 1;
}
else if (command.Verb == "south" || command.Verb == "s")
{
playerState.DesiredPosition.Y = playerState.DesiredPosition.Y + 1;
}
else if (command.Verb == "west" || command.Verb == "a")
{
playerState.DesiredPosition.X = playerState.DesiredPosition.X - 1;
}
else if (command.Verb == "east" || command.Verb == "d")
{
playerState.DesiredPosition.X = playerState.DesiredPosition.X + 1;
}
else if (command.Verb == "look")
{
playerState.WantsDescription = true;
}
else if (command.Verb == "inventory" || command.Verb == "inv")
{
playerState.WantsInventoryListed = true;
}
else if (command.Verb == "get")
{
playerState.WantsToGet = true;
}
else if (command.Verb == "help")
{
printf("Command List: look, quit, inventory, get, w, a, s, dn");
printf("Key:n");
printf(" @ - Playern");
printf(" A - Altarn");
printf(" i - Itemn");
printf(" . - Floorn");
printf(" # - Walln");
printf(" H - Door (Locked)n");
}
else
{
printf("I don't understandn");
}
printf("n");
}
void RenderGame(const PlayerState& playerState, const WorldState& worldState)
{
if (playerState.WantsDescription)
{
const RoomData& currRoom = worldState.Rooms[playerState.CurrentRoomIndex];
printf("================================================n");
printf("LOCATION: %sn", currRoom.Name.c_str());
printf("%snn", currRoom.Description.c_str());
std::string renderedMapString = "";
unsigned int currentSpace = 0;
while (currentSpace < currRoom.RoomMap.size())
{
char CharacterToDisplay = currRoom.RoomMap[currentSpace];
for (unsigned int i = 0; i < currRoom.Inventory.size(); ++i)
{
const InventoryItem& currItem = currRoom.Inventory[i];
if (PositionToIndex(currItem.ItemPosition, currRoom.RoomMapWidth) == currentSpace)
{
CharacterToDisplay = getItemIcon(currItem.Type);
}
}
for (unsigned int i = 0; i < currRoom.LockedDoors.size(); ++i)
{
const LockedDoorData& currDoor = currRoom.LockedDoors[i];
if (PositionToIndex(currDoor.DoorPosition, currRoom.RoomMapWidth) == currentSpace)
{
CharacterToDisplay = 'H';
}
}
//Set where the player is drawn based on the input X and Y coordinates
if (PositionToIndex(playerState.CurrentPosition, currRoom.RoomMapWidth) == currentSpace)
{
CharacterToDisplay = '@';
}
renderedMapString += CharacterToDisplay;
if (currentSpace % currRoom.RoomMapWidth == currRoom.RoomMapWidth - 1)
{
renderedMapString += "n";
}
currentSpace++;
}
printf("%sn", renderedMapString.c_str());
printf("n");
}
else if (playerState.WantsInventoryListed)
{
printf("================================================n");
printf("INVENTORY:n");
if (playerState.Inventory.size() == 0)
{
printf("You're not carrying anything.n");
}
else
{
for (unsigned int i = 0; i < playerState.Inventory.size(); ++i)
{
printf("%sn", GetItemName(playerState.Inventory[i].Type).c_str());
}
}
printf("n");
}
}
void UpdateGame(PlayerState& playerState, WorldState& worldState)
{
RoomData& currRoom = worldState.Rooms[playerState.CurrentRoomIndex];
if (playerState.DesiredPosition != playerState.CurrentPosition)
{
TryToUnlockDoor(playerState.DesiredPosition, currRoom, playerState);
if (spaceVoid(playerState.DesiredPosition, currRoom))
{
Position desiredRoomPosition = currRoom.RoomPosition;
int playerPositionType = 0;
if (playerState.DesiredPosition.X < 0)
{
desiredRoomPosition.X--;
playerPositionType = 1;
}
else if(playerState.DesiredPosition.X >= currRoom.RoomMapWidth)
{
desiredRoomPosition.X++;
playerPositionType = 2;
}
else if (playerState.DesiredPosition.Y < 0)
{
desiredRoomPosition.Y--;
playerPositionType = 3;
}
else if (playerState.DesiredPosition.Y >= ((int)currRoom.RoomMap.size() / currRoom.RoomMapWidth))
{
desiredRoomPosition.Y++;
playerPositionType = 4;
}
bool foundNewRoom = false;
for (unsigned int i = 0; i < worldState.Rooms.size(); ++i)
{
if (worldState.Rooms[i].RoomPosition == desiredRoomPosition)
{
playerState.CurrentRoomIndex = i;
playerState.WantsDescription = true;
switch (playerPositionType)
{
case 1:
playerState.CurrentPosition.X = worldState.Rooms[playerState.CurrentRoomIndex].RoomMapWidth - 1;
break;
case 2:
playerState.CurrentPosition.X = 0;
break;
case 3:
playerState.CurrentPosition.Y = (worldState.Rooms[playerState.CurrentRoomIndex].RoomMap.size() / worldState.Rooms[playerState.CurrentRoomIndex].RoomMapWidth) - 1;
break;
case 4:
playerState.CurrentPosition.Y = 0;
break;
}
foundNewRoom = true;
}
}
if (!foundNewRoom)
{
printf("It's just the void beyond this point.n");
}
}
else if (spaceOpen(playerState.DesiredPosition, currRoom))
{
playerState.CurrentPosition = playerState.DesiredPosition;
playerState.WantsDescription = true;
}
else
{
printf("It's blocked.n");
}
}
else if (playerState.WantsToGet)
{
bool foundItem = false;
for (unsigned int i = 0; i < currRoom.Inventory.size(); ++i)
{
const InventoryItem& currItem = currRoom.Inventory[i];
if (currItem.ItemPosition == playerState.CurrentPosition)
{
printf("Picked up a %snn", GetItemName(currItem.Type).c_str());
playerState.Inventory.push_back(currItem);
currRoom.Inventory.erase(currRoom.Inventory.begin() + i);
foundItem = true;
break;
}
}
if (!foundItem)
{
printf("There's nothing her to pick up.nn");
}
}
}
void CleanupGame(PlayerState& playerState, WorldState& worldState)
{
worldState.Rooms.clear();
}
int PositionToIndex(const Position& position, int roomWidth)
{
return position.Y * roomWidth + position.X;
}
bool spaceOpen(const Position& position, const RoomData& currRoom)
{
for (unsigned int i = 0; i < currRoom.LockedDoors.size(); ++i)
{
const LockedDoorData& currDoor = currRoom.LockedDoors[i];
if (currDoor.DoorPosition == position)
{
return false;
}
}
int spaceIndex = PositionToIndex(position, currRoom.RoomMapWidth);
return currRoom.RoomMap[spaceIndex] == '.';
}
void TryToUnlockDoor(const Position& position, RoomData& currRoom, PlayerState& playerState)
{
for (unsigned int i = 0; i < currRoom.LockedDoors.size(); ++i)
{
const LockedDoorData& currDoor = currRoom.LockedDoors[i];
if (currDoor.DoorPosition == position)
{
//Door found, now find key
for (unsigned int j = 0; j < playerState.Inventory.size(); ++j)
{
const InventoryItem& currItem = playerState.Inventory[j];
if (currItem.Type == ItemType_Key)
{
//Key found
currRoom.LockedDoors.erase(currRoom.LockedDoors.begin() + i);
playerState.Inventory.erase(playerState.Inventory.begin() + j);
return;
}
}
}
}
}
bool spaceVoid(const Position& position, const RoomData& currRoom, PlayerState& playerState)
{
return position.X < 0 || position.X >= currRoom.RoomMapWidth || position.Y < 0 || position.Y >= ((int)currRoom.RoomMap.size() / currRoom.RoomMapWidth);
}
std::string GetItemName(ItemType itemType)
{
switch (itemType)
{
case ItemType_Key:
return "Key";
break;
case ItemType_Sword:
return "Sword";
break;
}
}
char getItemIcon(ItemType itemType)
{
switch (itemType)
{
case TextGame::ItemType_Key:
return 'k';
break;
case TextGame::ItemType_Sword:
return 's';
break;
}
}
}
链接器抱怨找不到采用两个参数的spacevoid
方法:
bool __cdecl TextGame::spaceVoid(struct TextGame::Position const &,struct TextGame::RoomData const &)
因为在您的代码中只有一个定义了三个参数的spacevoid
方法:
bool spaceVoid(const Position& position, const RoomData& currRoom, PlayerState& playerState)
您需要确定哪一个是正确的,或者添加一个额外的spacevoid
方法,只采用两个参数。
相关文章:
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 尝试运行 wasm 函数时出现模块未定义错误
- c++中数组的未定义错误
- 基类未定义.错误 C2504
- 获取线函数未定义错误。无法在字符串中保存可验证的内容
- 对于我的 ComplexNumber 中的某些方法,我得到了一个奇怪的未定义错误引用.cpp,不过我对模板很陌生
- 类类型重定义和基类未定义错误
- C 中的基类未定义错误
- QML[未定义]错误
- 如何构建使用 OpenCV 的 XCode 6 iOS 应用程序 - 未定义错误__cplusplus
- 变量未定义错误
- 静态方法声明但未定义错误c++
- c++ cocos-2d-x未定义错误
- 基类未定义错误(C2504)
- 单例作为模板,未定义错误
- Solaris库与STLport4.6.2链接,出现与ostream相关的未定义错误