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)。分了,但继续收到这样的错误。
答案 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)
答案 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()