C ++ не находит определения типов?

0

Итак, я начал изучать C++ около года назад, я изучил Java С# и VB.NET перед этим. Как и сейчас, я считаю себя продвинутым C++ кодером. Тем не менее, это единственное, чего я не понимаю. Процесс связывания. И вот проблема. Прямо сейчас, im кодируя XNA-подобную библиотеку для разработки игр с базовой Component System, но я получаю ошибки компилятора при ее создании, C++ притворяется, что он не знает определенного типа, в этом случае класс GameComponent не знает, Класс ComponentSelector (и наоборот), хотя его правильно включить и ввести. Я собираюсь показать вам два файла заголовка, надеюсь, вы можете мне помочь.

ComponentSelector.hpp:

#ifndef COMPONENTSELECTOR_HPP
#define COMPONENTSELECTOR_HPP
#include<sem/System/Types.hpp>
#include<sem/System/GameComponent.hpp>
#include<vector>
namespace sem
{
    class ComponentSelector
    {
    public:
        GameComponent* getComponent1(); //GameComponent does not name a type
        GameComponent* getComponent2(); //GameComponent does not name a type
        GameComponent* getComponent3(); //GameComponent does not name a type
        void addComponent(GameComponent* item); //GameComponent does not name a type
        void removeComponent1();
        void removeComponent2();
        void removeComponent3();
        void clearList();
    private:
        std::vector<GameComponent*> m_Components;
    protected:
    };
}
#endif // COMPONENTSELECTOR_HPP

GameComponent.hpp:

#ifndef GAMECOMPONENT_HPP
#define GAMECOMPONENT_HPP

#include<sem/System/ComponentSelector.hpp>
#include <sem/System/Types.hpp>

namespace sem
{
    class GameComponent
    {
    public:
        virtual void load() = 0;
        virtual void unload() = 0;
        virtual void update() = 0;
        virtual void draw() = 0;

        ComponentSelector* m_Selector; //ComponentSelector does not name a type

        SEMlong getID();
        SEMstring getName();
        SEMstring getType();
    private:
        SEMlong m_ComponentID;
        SEMstring m_ComponentName;
        SEMstring m_ComponentType;
    protected:
    };
}

#endif // GAMECOMPONENT_HPP

Любое решение и советы будут очень признательны.

  • 1
    После вашего первого набора #includes вы должны набрать Class GameComponent. Это называется предварительным объявлением. Тогда вы можете получить реализацию позже, что вы и делаете.
  • 0
    Вы, кажется, указываете, что здесь есть два заголовочных файла, но ваш макет вопроса выглядит как один. Они в отдельных файлах или только в одном? Если они раздельные, обновите вопрос, чтобы отразить это.
Показать ещё 3 комментария
Теги:
gcc
g++

1 ответ

1
Лучший ответ

Для объявления класса ComponentSelector в GameComponent класса GameComponent декларацию GameComponent:

// Remove this: #include<sem/System/ComponentSelector.hpp> 
#include <sem/System/Types.hpp>

namespace sem
{
    class ComponentSelector; // Note the forward declaration added!

    class GameComponent
    {
         // ...
         ComponentSelector* m_Selector; // Compiles now!
         // ...

Я бы рекомендовал сделать то же самое в заголовке объявления ComponentSelector наоборот. Включить полные декларации класса тогда, когда вы собираетесь использовать какие - либо элементы (это в единицах компиляции т.е. .cpp -files, как правило).

  • 0
    если я это сделаю, то компилятор потерпит неудачу при сборке и выдаст это сообщение об ошибке (старая ошибка исчезла): ||=== Build: x64 in sem (compiler: TDM GCC x64) ===| include\sem\System\Thread.hpp|21|warning: inline function 'static void sem::Thread::sleep(sem::SEMlong)' used but never defined [enabled by default]| include\sem\System\ComponentSelector.hpp.gch||No such file or directory| ||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 3 second(s)) ===|
  • 0
    @DanielWanner Прочитайте мои обновления и посмотрите, для чего предназначены предварительные объявления. Те ошибки, которые вы упоминаете, вызваны в другом месте. Тот, который вы просили, должен быть исправлен, если вы последуете моему совету.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню