【问题标题】:C++ pointer to incomplete class type is not allowed不允许指向不完整类类型的 C++ 指针
【发布时间】:2015-10-09 10:07:27
【问题描述】:

我正在尝试创建一个实体系统。 每个实体都有一个组件列表,每个组件都有一个指向父实体的指针。

=========================示例代码:==================== =====

---------------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] -> 我得到的指针指向不完整的类类型是不允许的。 我知道,这是因为 Dog 标头中的 AnimalCare 类只是声明但未定义。 ->有没有办法解决这个问题?

【问题讨论】:

  • 您需要在Dog.cpp 中包含AnimalCare.h
  • 我试过了,它给了我很多错误...
  • 这些错误可能会为您指明正确的方向。您也不应该在AnimalCare.h 中包含Dog.h:前向声明即可。
  • 缺少分号“;”在狗课结束时。比在 .cpp 中包含 Dog.h。
  • Dog::GetParentName()return parent-&gt;GetName();。我不明白您为什么会收到“指向不完整类型的指针”错误;你应该得到一个未定义的符号错误。您可能打算使用的成员是g_parent。您在问题中输入的代码是否与您实际尝试编译的代码相同?

标签: c++ class pointers c++11


【解决方案1】:

您需要将此添加到 Dog.cpp:

#include "AnimalCare.h"

另外,您缺少 ;在你的 Dog 类声明之后,它应该是:

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

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

【讨论】:

  • 谢谢 :D,原来如此简单。 :( 那只是一个示例代码。实际代码要大得多。
  • 没问题。有时只需要第二双眼睛来看看。如果它解决了您的问题,请接受此答案。谢谢
猜你喜欢
  • 2021-12-31
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多