Необъявленные объявления идентификаторов присутствуют в заголовке, но не идентифицированы в источнике класса

Итак, у меня, вероятно, довольно простая проблема, но я не могу понять, что ее вызывает.

У меня есть класс С++ под названием "Game", состоящий из объявления класса в Game.h и исходного определения в Game.cpp.

Я включил «Game.h» в свой «Game.cpp», но по какой-то причине Visual Studio не распознает объявления классов в Game.h.

Я был бы признателен за любую помощь, которую я мог бы получить, пытаясь понять, почему это так, и почему я получаю следующие ошибки: 'MyCharacter' : undeclared identifier и 'HandleKeyPressed' : identifier not found.

Игра.ч:

------------------------------------------------------------------------------------------------------------------
#pragma once
#ifndef Game_Header
#define Game_Header


#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include "Character.h"
#include "FloorPlatform.h"

class Game
{
public:
        Game();
        ~Game();
        int Run();
        void HandleKeyPressed(sf::Keyboard::Key);
        Character MyCharacter;
};

#endif // !Game_Header

Сокращенная игра.cpp

#include "Game.h"


Game::Game()
{
}


Game::~Game()
{
}

int Run(){
        sf::RenderWindow MainGameWindow(sf::VideoMode::getDesktopMode(), "A Test Game");

        //Start Game Loop
        while (MainGameWindow.isOpen()){
                while (MainGameWindow.pollEvent(event)){
                        //Handle some other events here...
                        if (event.type == sf::Event::KeyPressed){
                                HandleKeyPressed(event.key.code);
                        }
                }


                MainGameWindow.clear(sf::Color::White);

                MyCharacter.Instance.Circle.setPosition(MyCharacter.PlayerLocation);
                MainGameWindow.draw(MyCharacter.Instance.Circle);
                MainGameWindow.display();

        }

        return 0;
}

void HandleKeyPressed(sf::Keyboard::Key PressedKey){
        switch (PressedKey)
        {
        case sf::Keyboard::A:
             MyCharacter.PlayerLocation.x -= 16;
        break;

        }
}

Полный код можно найти здесь: http://pastebin.com/x6KhDxgL

Заранее спасибо за любую помощь, которую я могу получить с этим.


person Brandon S.    schedule 03.05.2015    source источник


Ответы (2)


Пытаться

int Game::Run()

вместо

int Run()

в Game.cpp то же самое для HandleKeyPressed, потому что это метод класса Game. В зависимости от вашего Character.h вам также может понадобиться инициализировать MyCharacter.

person Adalee    schedule 03.05.2015
comment
Вау... чувствую себя идиотом. Итак, простое изменение методов на пространство имен Game решило проблему. Почему объявление пространства имен не приводит к тому, что другие члены класса не распознаются? Кто-нибудь может это объяснить? Кроме того, для ясности: я изменил int Run() и void HandleKeyPressed на int Game::Run() и void Game::HandleKeyPressed, как было предложено. - person Brandon S.; 03.05.2015
comment
Потому что вы объявляете определения методов вне определения класса. Если вы написали целые методы в определении Game в своем Game.h, вероятно, все будет в порядке. Поскольку вы делаете это вне класса, вам нужно использовать :: (оператор области видимости). А также #inlude "Game.h" не равнозначно использованию пространства имен. - person Adalee; 03.05.2015
comment
Ах... Это немного проясняет ситуацию, но почему это влияет на идентификатор MyCharacter? Я думаю, что, поскольку идентификатор объявлен в Game.h, его можно использовать во всем Game.cpp. Я ценю помощь. Я рад, что мой материал работает, я просто действительно пытаюсь понять это немного лучше, поэтому мне не придется задавать столько глупых вопросов в будущем. Спасибо. - person Brandon S.; 03.05.2015
comment
Я думаю, что это похоже на объявление int a — вы не присваиваете никакого значения частям MyCharacter. Однако я просто догадываюсь об этой части, так как не могу запустить весь ваш код (включая файлы заголовков). Если это проблема, присвойте ей значения в конструкторе Game. Кроме того, если этот ответ поможет вам, отметьте его как принятый. - person Adalee; 03.05.2015

void HandleKeyPressed(sf::Keyboard::Key PressedKey){

В Game.cpp должно быть

void Game::HandleKeyPressed(sf::Keyboard::Key PressedKey){

То же самое для int run()

person Henrik Ståhlberg    schedule 03.05.2015