如何避免前向声明错误?
How can I avoid forward declaration error?
我在 C++ 中得到了以下代码:
class Level;
class Node
{
char letter;
std::string path[2];
Node *next;
Level *nlevel;
public:
Node()
{
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
}
Node(char l, unsigned int h)
{
letter = l;
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
nlevel->height = h;
}
virtual ~Node();
};
class Level
{
std::list<Node> vnodes;
unsigned int height;
public:
Level();
virtual ~Level();
};
调用或声明 classes 的正确方法是什么?我一直在阅读 this 并且我已经尝试将 class Level;
放在 class Node 之前但是我得到了一个前向声明错误并且如果我将每个 class 分开在一个不同的文件中以便稍后包含无论如何我都会得到一个错误,因为它们相互依赖,所以应该如何声明它们?
解决此问题的方法是将 Node
的函数定义放在 Level
的 class 定义之后,这样编译器有完整的类型描述:
class Level;
class Node
{
char letter;
std::string path[2];
Node *next;
Level *nlevel;
public:
Node(); // put the definition after
Node(char l, unsigned int h);
virtual ~Node();
};
class Level
{
std::list<Node> vnodes;
unsigned int height;
public:
Level();
virtual ~Level();
};
// put node's function definitions AFTER the definition of Level
Node::Node()
{
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
}
Node::Node(char l, unsigned int h)
{
letter = l;
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
nlevel->height = h; // Now you have access problem
}
或者您可以将函数 definitions 移动到单独的 .cpp
源文件中。
现在你有一个新问题,nlevel->height = h;
正在尝试访问 Level
的 private 成员。
只有使用前向声明的指针才能进行前向声明class。由于您在 nlevel->height = h;
使用 Level
的成员,因此您必须更改 class 的定义顺序。这会起作用,因为 Level
只包含一个指向 Node
.
的指针
因为 height
是 Level
的私有成员,所以您还必须将 friend class Node;
添加到 class Level
.
class Node;
class Level
{
friend class Node;
std::list<Node> vnodes;
unsigned int height;
public:
Level();
virtual ~Level();
};
class Node
{
char letter;
std::string path[2];
Node *next;
Level *nlevel;
public:
Node()
{
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
}
Node(char l, unsigned int h)
{
letter = l;
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
nlevel->height = h;
}
virtual ~Node();
};
我在 C++ 中得到了以下代码:
class Level;
class Node
{
char letter;
std::string path[2];
Node *next;
Level *nlevel;
public:
Node()
{
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
}
Node(char l, unsigned int h)
{
letter = l;
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
nlevel->height = h;
}
virtual ~Node();
};
class Level
{
std::list<Node> vnodes;
unsigned int height;
public:
Level();
virtual ~Level();
};
调用或声明 classes 的正确方法是什么?我一直在阅读 this 并且我已经尝试将 class Level;
放在 class Node 之前但是我得到了一个前向声明错误并且如果我将每个 class 分开在一个不同的文件中以便稍后包含无论如何我都会得到一个错误,因为它们相互依赖,所以应该如何声明它们?
解决此问题的方法是将 Node
的函数定义放在 Level
的 class 定义之后,这样编译器有完整的类型描述:
class Level;
class Node
{
char letter;
std::string path[2];
Node *next;
Level *nlevel;
public:
Node(); // put the definition after
Node(char l, unsigned int h);
virtual ~Node();
};
class Level
{
std::list<Node> vnodes;
unsigned int height;
public:
Level();
virtual ~Level();
};
// put node's function definitions AFTER the definition of Level
Node::Node()
{
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
}
Node::Node(char l, unsigned int h)
{
letter = l;
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
nlevel->height = h; // Now you have access problem
}
或者您可以将函数 definitions 移动到单独的 .cpp
源文件中。
现在你有一个新问题,nlevel->height = h;
正在尝试访问 Level
的 private 成员。
只有使用前向声明的指针才能进行前向声明class。由于您在 nlevel->height = h;
使用 Level
的成员,因此您必须更改 class 的定义顺序。这会起作用,因为 Level
只包含一个指向 Node
.
因为 height
是 Level
的私有成员,所以您还必须将 friend class Node;
添加到 class Level
.
class Node;
class Level
{
friend class Node;
std::list<Node> vnodes;
unsigned int height;
public:
Level();
virtual ~Level();
};
class Node
{
char letter;
std::string path[2];
Node *next;
Level *nlevel;
public:
Node()
{
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
}
Node(char l, unsigned int h)
{
letter = l;
path[0] = "";
path[1] = "";
next = NULL;
nlevel = NULL;
nlevel->height = h;
}
virtual ~Node();
};