Как получить ссылку на другой класс, чтобы получить значение переменной внутри указанного класса? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть класс с именем MapGraph и другой класс с именем GameState. Я вызываю две функции с именами GoToLocation(NextLocation); и Game->SidePanel(); из main. Объявление и определение GoToLocation () существуют в MapGraph.h и MapGraph.cpp соответственно, а объявление и определение SidePanel () существуют в GameState.h и GameState.cpp соответственно. В SidePanel () я пытаюсь получить значение переменной с именем CurrentLocation, которая существует в MapGraph и является публичной. Я включил MapGraph.h в GameState.cpp и объявил класс как class MapGraph;, но я не знаю, как получить значение переменной. Если я сделаю MapGraph* Map = new MapGraph;, это всегда даст мне начальное значение переменной, а не обновленное. Любая помощь будет оценена. Спасибо.

Код в main.cpp :

int main()
{
    MapGraph* Map = new MapGraph;
    GameState* Game = new GameState;
    //Game->MainMenu();

    Map->GoToLocation(MapGraph::LocationNames::CastleSquare);
    Game->SidePanel();

    //system("CLS");
    return 0;
}

MapGraph.h :

#pragma once

#include <iostream>
#include <list>
#include <string.h>

class MapGraph
{
public:
    MapGraph();

    enum class LocationNames
    {
        GraveYard = 0,
        Sewers = 1,
        Outskirts = 2,
        Barracks = 3,
        Town = 4,
        CastleSquare = 5,
        ThroneRoom = 6,
        Forest = 7,
        Gutter = 8,
        HunterShack = 9
    };

    std::string LocNamesString[10] =
    {
        "Grave Yard",
        "Sewers",
        "Outskirts",
        "Barracks",
        "Town",
        "Castle Square",
        "Throne Room",
        "Forest",
        "Gutter",
        "Hunter Shack"
    };

    LocationNames CurrentLocation;
    void GoToLocation(LocationNames NextLocation);
};

и GameState.cpp :

#include <iostream>
#include <stdlib.h>
#include "GameState.h"
#include "MapGraph.h"

class MapGraph;

void GameState::SidePanel()
{
    MapGraph* Map = new MapGraph;

    std::cout << Map->LocNamesString[(int)Map->CurrentLocation];
}

PS: Я пытался изменить CurrentLocation в MapGraph.h на static, но это всегда вызывает ошибку компоновщика 2001. ошибка исчезнет, ​​как только я уберу слово static.

Спасибо.

1 Ответ

0 голосов
/ 08 ноября 2019

Есть несколько способов создать эти отношения. Вам решать, что лучше всего подходит к вашему дизайну. (Один большой вопрос заключается в том, сколько MapGraph объектов вы ожидаете существовать одновременно?) Самый простой подход может состоять в том, чтобы передать необходимую переменную в качестве параметра.

void GameState::SidePanel(cosnt MapGraph & Map)
{
    std::cout << Map.LocNamesString[(int)Map.CurrentLocation];
}

Тем не менее, я быПройдите немного дальше и включите эту логику в класс MapGraph. В этом случае ваша функция становится

void GameState::SidePanel(cosnt MapGraph & Map)
{
    std::cout << Map.CurrentLocationName();
}

, и в MapGraph определение

class MapGraph {
    // Existing stuff here

public:
    std::string CurrentLocationName()
    {
        return LocNamesString[(int)CurrentLocation];
    }

    // Possibly more definitions here
};

добавляется следующее правило. Как правило, только ваша реализация MapGraph должназнать, как MapGraph данные хранятся. Когда другому коду требуется комбинация данных MapGraph (например, преобразование текущего местоположения в строку), класс MapGraph должен предоставить интерфейс для этого.

Кстати, LocNamesString должно быть static и const. Ключевое слово static говорит о том, что строки имен не отличаются от объекта MapGraph до объекта MapGraph. Ключевое слово const говорит, что строки имени не изменяются после инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...