Итак, я начал изучать 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
Любое решение и советы будут очень признательны.
Для объявления класса 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, как правило).
||=== 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)) ===|