1. ホーム
  2. c++

[解決済み] 不完全なクラス型へのC++ポインタは許されない

2022-02-17 05:59:59

質問

エンティティシステムを作ろうとしています。 各エンティティはコンポーネントのリストを持ち、各コンポーネントは親エンティティへのポインタを持っています。

========================Example Code:=========================

---------------Dog.h--------------------
    #include <string>

    class AnimalCare;
    class Dog
    {
    public:
    Dog(AnimalCare* parent);

    std::string GetParentName();
    void Feed(void*);
    private:
    AnimalCare* g_parent;
    }
    ----------------------------------------

    ----------------Dog.cpp-----------------
    #include "Dog.h"

    Dog::Dog(AnimalCare* parent){
     g_parent =parent;
    }

    void Dog::Feed(void* food){
     //TODO: Feeding
    }

    std::string Dog::GetParentName(){
    [1]return parent->GetName();
    }
    ----------------------------------------

    ---------------AnimalCare.h-------------
    #include "Dog.h"

    class AnimalCare{
    public:
       AnimalCare(std::string name);

       std::string GetName();
       void InitDog();
    private:
       std:string g_name;
       Dog* g_dog;
    };
    ----------------------------------------

    --------------AnimalCare.cpp------------
    #include "AnimalCare.h"

    AnimalCare::AnimalCare(std::string name){
       g_name =name;}

    std:string AnimalCare::GetName(){
      return g_name;}

    void AnimalCare::InitDog(){
      g_dog = new Dog(this);}

============================================================

[1] -> incomplete class type is not allowedへのポインタが表示されるのですが。 DogヘッダのAnimalCareクラスが宣言されているだけで定義されていないからだと思いますが。-これを回避する方法はないでしょうか?

どのように解決するのですか?

Dog.cppに追加する必要があります。

#include "AnimalCare.h"

また、Dogのクラス宣言の後の;が抜けているので、そうする必要があります。

class Dog
{
public:
Dog(AnimalCare* parent);

std::string GetParentName();
void Feed(void*);
private:
AnimalCare* g_parent;
};