LNK2019错误;此处缺少/未定义的内容

LNK2019 error; what is missing/not defined here?

本文关键字:未定义 错误 LNK2019      更新时间:2023-10-16

当我尝试构建我的程序时,出现此错误:

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方法,只采用两个参数。