C++ - 嵌套包含 - 避免'include nested too deeply error'
C++ - Nested include - Avoiding 'include nested too deeply error'
如果我想在我的C++代码中具有以下连接,那么声明我的头文件的最佳方法是什么,这样我就不会得到"包含嵌套太深的错误"?
在我的边缘类上,我有一些函数需要返回一个 Node 对象。与 Edge 类相同,我有需要返回 Node 对象的函数。但是编译器不允许我有这个嵌套循环的东西。
节点.h
#ifndef _NODE_h__
#define __NODE_h__
#include "Edge.h"
public:
Node();
~Node();
void setName(string);
string getName();
void addEdge(Edge*);
vector<Edge* > getEdges() { return _edges; };
};
#endif
边缘.h
#ifndef _EDGE_h__
#define __EDGE_h__
#include "Node.h"
class Edge
{
public:
Edge();
Edge(bool);
~Edge();
bool hasBeenSeen() { return _seen; };
void reset() { _seen = false; }; // resets seen param to false
Node* getSource() { return _source; };
Node* getTarget() { return _target; };
void setSource(Node* source) { _source = source; };
void setTarget(Node* target) { _target = target; };
};
#endif
正如其他人所建议的那样,使用标题保护。但也尝试向前声明有问题的类。您可能还必须在至少一个类中使用指针(而不是值),但是如果没有看到代码,我们就无法判断。
所以 edge.h 应该像这样:
#ifndef EDGE_H
#define EDGE_H
class Node; // forward declaration
Node functionB();
#endif
请注意,您必须在单独的C++文件中定义函数,然后 #includes"node.h"。
如果这一切看起来非常复杂,那么您应该尝试简化您的设计。节点和边可能没有必要相互了解——单向依赖就足够了。
最后,包含双下划线的名称保留在C++中 - 您不允许在自己的代码中创建此类名称。
Edge.h
#ifndef EDGE_H_INCLUDED
#define EDGE_H_INCLUDED
class Node;
class Edge
{
int edge_num;
public:
Edge(int i) : edge_num(i) { };
Node memberB();
};
#include "Node.h"
Node Edge::memberB() { Node n(edge_num); return n; }
Node functionB() { Node n(2); return n; }
#endif /* EDGE_H_INCLUDED */
节点.h
#ifndef NODE_H_INCLUDED
#define NODE_H_INCLUDED
class Edge;
class Node
{
int node_num;
public:
Node(int i) : node_num(i) { };
Edge memberA();
};
#include "Edge.h"
Edge Node::memberA() { Edge e(node_num); return e; }
Edge functionA() { Edge e(1); return e; }
#endif /* NODE_H_INCLUDED */
请注意,在包含其他标头之前,我已经向前声明了类"Edge"和"Node",因此在定义函数或成员函数时,也定义了它返回的类。
你的包含守卫的问题在于它们不匹配!
你测试_SOMETHING
(一个下划线),如果没有找到,你定义__SOMETHING
(两个下划线);这两个应该匹配,否则包含保护不起作用!
正如其他人所指出的那样,避免以下划线开头,因为这些下划线是为库和操作系统保留的。
通过使用杂注保护或#pragma once
(后者,如果您的编译器支持),可以防止这种情况。
要使用杂注防护,只需执行以下操作:
#ifndef SOME_IDENTIFIER
#define SOME_IDENTIFIER
// ... code ...
#endif
确保更改每个头文件的SOME_IDENTIFIER
。通常人们把它弄NAME_OF_HEADER_H
;如果更改标识符的两个实例,请确保更改一个实例。
此外,如果您这样做,请确保您所做的任何#include
都在编译指示防护装置内。
如果您只想使用 #pragma once
并且您的编译器支持它,则只需添加
#pragma once
到头文件的顶部。
另一方面,请考虑将函数的定义移动到functionA
和functionB
到它们自己的.cpp文件中,并将原型仅保留在 .h 文件中,这样就不会收到链接器错误。
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 如何修复"too few arguments to function"?
- fopen 在创建大量文件后因 EFBIG "File too large" 而失败
- VC++ wcscpy_s随机断言"Buffer is too small"
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- VS说"Too few arguments...",但其他编译器给了我正确的输出?
- 连接到MySQL时如何修复xdev C++ api中的'string too long'错误
- c++ (XORString): "recursive type or function dependency context too complex"
- 尝试在 eclipse CDT 中提取函数时"Too many declarations in selection"错误消息
- 将嵌套结构变量从 C++ 传递到C++ dll 会导致 (L "Buffer is too small" && 0)
- GCC 抑制警告"too small to hold all values of"
- 模板专用化站点报告"too few template-parameter-lists"错误
- 在装有 GCC 4.8 的 Mac 上"error: too many #pragma options align=reset"
- 错误:在 c++ 中"too few arguements in template class name 'queue' "
- "Too Many Files" Nexus 5/6棒棒糖上的错误
- 模板专业化 -> 'too few template-parameter-lists'
- 如何修复("too few arguments in function call")?
- ReadFile Rs232 Too Slow
- C++ - 嵌套包含 - 避免'include nested too deeply error'