继承类时“无效使用不完整类型'class tree_node_t'

时间:2018-09-16 16:28:19

标签: c++

node.h:

#include "tree_node.h"

class tree_node_t;
class node_base : public tree_node_t
{
public:
    node_base();
    ~node_base();
};

tree_node.h:

#include "node.h"

class node_base;
class tree_node_t
{
    tree_node_t();

    std::vector<node_base*> list;
    . . .
}

一切似乎都是正确的,但是由于某种原因,我收到了错误消息“无效使用了不完整类型'class tree_node_t'。”我不明白为什么会这样。

据我了解,解决这些问题的方法是将文件分为标头(.h)和源代码文件(.cpp)。分了,但继续收到这样的错误。

3 个答案:

答案 0 :(得分:1)

您不能从不完整的类型继承。为了正确确定类的大小以及数据成员的偏移量,编译器从其继承时,需要具有tree_node_t的完整定义。

但是通过在已经包含头文件之后放置class tree_node_t;,可以隐藏编译器所需的定义。因此,除非删除行include guards,否则只需删除行class tree_node_t;就可以使一切编译正常。

Rudolfs Bundulis正确指出,您还需要删除#include "node.h"中的tree_node.h,因为否则包含tree_node.h时传递给编译器的代码看起来像这样:

class node_base : public tree_node_t
{
public:
  node_base();
  ~node_base();
 };

 class node_base;
 class tree_node_t
 {
   tree_node_t();

   std::vector<node_base*> list;
   . . .
 };

由于tree_node_t的定义突然出现在试图继承node_base的定义之后,所以无法编译。

答案 1 :(得分:0)

natersozMarkus是正确的。我要做的就是从#include中删除tree_node.h

答案 2 :(得分:0)

  

据我了解,解决这些问题的方法是将   文件分为标头(.h)和源代码文件(.cpp)。

将代码拆分为文件通常是首选的解决方案。至少对您有好处。

但是,通常,人们仍然可以在一个文件中执行此代码,在这种情况下,只需一个向前声明即可。

以下内容进行编译,链接和运行(但效果很小):


#include <iostream>
using std::cout, std::flush, std::endl;

#include <vector>
using std::vector;

// in this ordering, the single forward suffices,
//   because all class pointers are a known size,
// and
//    this symbol (as yet) is only in the tree_node_t data, 
//    in the vector as a pointer

class node_base_t;


class tree_node_t
{
   // private data attributes
   vector<node_base_t*> list;

   // tbd ... other data

public:
   tree_node_t()  // default ctor
   // : list ctor is ok
      {
         cout << "\n  tree_node_t() " << flush;
      }

   ~tree_node_t() = default; // dtor

   // tbd ... more public functions

private:
   // tbd ... private functions
};


class node_base_t : public tree_node_t
{
   // private data
   // ... tbd - other data
public:
   node_base_t()  // tree_node_t default ctor is ok
      {
         cout << "\n  node_base_t() " << flush;
      }

    ~node_base_t() = default;

   // tbd ... more public functions
private:
   // tbd ... private functions
};

int main(int , char** )
{
   int retVal = -1;
   {
      node_base_t  nb;

      retVal = 0;
   }
   cout << "\n" << endl;

   return retVal;
}

输出:

  tree_node_t() 
  node_base_t()