2017-05-21 12 views
1

私はsfmlでゲームを作成しようとしていますが、このゲームではエンジェルコンポーネントシステムを使用しようとしています。しかし、コンパイルするとエラーが発生し、どのように修正するのか分かりません。ここでエンティティコンポーネントシステム定義されていないシンボル

は私のentity.hppクラスです:

#ifndef Entity_hpp 
#define Entity_hpp 

#include <stdio.h> 
#include <iostream> 
#include <vector> 
#include <Component.hpp> 

using namespace std; 

class Entity { 

private: 
    vector<unique_ptr<Component>> _components; 
public: 
    void Start(); 
    void Update(); 
    void Draw(); 

    template <typename T, typename... TArgs> T& AddComponent(TArgs... args); 
    template <typename T> T& GetComponent(); 
}; 

#endif /* Entity_hpp */ 

次はEntity.cppクラスである:私は私のコンポーネントを追加

#include "Entity.hpp" 

void Entity::Update() { 
    for (auto& c : _components) { 
     c->Update(); 
    } 
} 

void Entity::Draw() { 
    for (auto& c : _components) { 
     c->Draw(); 
    } 
} 

void Entity::Start() { 
    for(auto& c : _components) { 
     c->Start(); 
    } 
} 

template <typename T, typename... TArgs> 
T& Entity::AddComponent(TArgs... args) { 
    T* component(new T(forward<T>(args)...)); 

    component->entity = this; 

    unique_ptr<T> ptr{component}; 
    _components.emplace_back(move(ptr)); 

    return *component; 
} 

template <typename T> T& Entity::GetComponent() { 
    T* c; 

    if(find(_components.begin(), _components.end(), c) != _components.end()) { 
     return &c; 
    } 

    return nullptr; 
} 

マイゲームクラス:

#include "Game.hpp" 

void Game::Start() { 
    auto& entity(_system.AddEntity()); 
    auto& m(entity.AddComponent<Movement>()); 
} 

void Game::Update() { 

} 

最後に、私のコンポーネントとその親:

#ifndef MovementComponent_hpp 
#define MovementComponent_hpp 

#include <stdio.h> 

#include <Component.hpp> 

class Movement : Component { 

public: 
    Movement() {}; 

    void Start() override {}; 
    void Update() override {}; 
    void Draw() override {}; 
}; 

#endif /* MovementComponent_hpp */ 

はcppのファイルに

#ifndef Component_hpp 
#define Component_hpp 

#include <stdio.h> 

using namespace std; 

class Entity; 

class Component { 

public: 
    Entity* entity{nullptr}; 
    virtual void Start(); 
    virtual void Update(); 
    virtual void Draw(); 
    virtual ~Component(); 
}; 


#endif /* Component_hpp */ 

を実装していない両そして、これは私が取得していますエラーです:

Ld /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug/SFML.app/Contents/MacOS/SFML normal x86_64 
    cd /Users/joeywelvaadt/Desktop/XCode/C++/SFML 
    export MACOSX_DEPLOYMENT_TARGET=10.7 
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -L/Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug -L/usr/local/lib -F/Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug -F/Library/Frameworks -filelist /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Intermediates/SFML.build/Debug/SFML.build/Objects-normal/x86_64/SFML.LinkFileList -Xlinker -rpath -Xlinker @loader_path/../Frameworks -mmacosx-version-min=10.7 -Xlinker -object_path_lto -Xlinker /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Intermediates/SFML.build/Debug/SFML.build/Objects-normal/x86_64/SFML_lto.o -stdlib=libc++ -fobjc-link-runtime -framework sfml-system -framework sfml-window -framework sfml-graphics -framework sfml-audio -framework sfml-network -Xlinker -dependency_info -Xlinker /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Intermediates/SFML.build/Debug/SFML.build/Objects-normal/x86_64/SFML_dependency_info.dat -o /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug/SFML.app/Contents/MacOS/SFML 

Undefined symbols for architecture x86_64: 
    "Movement& Entity::AddComponent<Movement>()", referenced from: 
     Game::Start() in Game.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

答えて

0

テンプレートの宣言と定義が(同じファイル内に滞在する必要がありますヘッダーの最後に実装ファイルを含めることによっても何らかの方法でそれらを区切ることができますが、わかりやすくするためにこの問題を簡略化しています)。これはあなたのEntity::AddComponentメンバ関数の場合ではないため、エラーです。
テンプレートシステムのような機能を使いたい場合は、少し深めておいてください。
あなたのメンバーテンプレート関数の定義を.hppに移動して、もう一度やり直してください。

+0

大歓迎です。これは新しいC++開発者にとっては非常に一般的なエラーです。 ;-) あなたの問題を解決する場合は、SOの回答を受け入れることを忘れないでください。 – skypjack

+0

私はそれを知りませんでしただけでなく、新しいC + +の種類もstackoverflowの新しい –

+0

@ DanyloWelvaadtさて、また歓迎StackOverflow。 ;-) – skypjack

関連する問題