结构在单独的头文件中导致c++中的问题
struct in separate header file causing problems in C++
我有一个在Class Parser
内定义的struct Tree
。我在Parser
中定义了以Tree
为输入的方法。
void Parser::InputTree(const Tree& input) {
//uses data from Tree
}
一切似乎都很好。但是后来我需要在课堂外使用Tree
。所以我决定在一个单独的头中定义struct Tree
。我在Parser
的头文件中包含了这个头文件。虽然我在Parser的头文件中没有看到错误,但源文件在Eclipse上显示了错误。表示没有找到指向方法InputTree
的成员声明。
我的问题是,首先这是正确的策略来定义一个单独的头结构吗?第二,我做错了什么?第三,我也有一些enum
类型,我想跨类使用。我在哪里定义它?
右结构:
parser.h
#ifndef _PARSER_H_
#define _PARSER_H_
#include "tree.h"
class Parser {
void InputTree(const Tree& input);
};
#endif /*_PARSER_H_*/
parser.cpp
#include "parser.h"
void Parser::InputTree(const Tree& input){
// use data from Tree
}
tree.h
#ifndef _TREE_H_
#define _TREE_H_
struct Tree {
//nodes
};
#endif /*_TREE_H_*/
包括parser.h
,包括tree.h
,因此struct Tree
在主编译单元中可用。
我通常遵循的一个简单的经验法则是,如果自定义数据类型(即struct, enum等)仅在类中使用,那么我最终会在类的定义中定义该数据类型。
但是,如果需要在2个或更多的类中使用相同的类型(没有任何父子关系),那么我最终要么在另一个头文件中定义类型,要么通常在名称空间中定义类型(当类型以某种方式相关时)。
是的,如果您觉得有必要区分它们,您可以在多个头文件中使用多个这样的名称空间(对相关类型进行分组),但是我只展示了一个使用单个名称空间的简单示例:
/* MyNamespace.h */
#ifndef MY_NAMESPACE_H
#define MY_NAMESPACE_H
namespace MyNamespace {
struct Tree {
int a;
char b;
};
enum SomeEnum {
VALUE_0 = 0,
VALUE_1 = 1,
VALUE_2 = 2
};
}
#endif
/* Parser.h */
#ifndef PARSER_H
#define PARSER_H
#include "MyNamespace.h"
class Parser
{
public:
void InputTree(const MyNamespace::Tree& input);
};
#endif
/* Parser.cpp */
#include "Parser.h"
void Parser::InputTree(const MyNamespace::Tree& input)
{
}
是的,在单独的头文件中定义结构体是正确的策略。
如果没有更多的输入,很难说你做错了什么-但它可能与包括,包括保护或命名空间不匹配有关。
最后,您应该在另一个头文件中声明枚举,并使用适当的include保护符
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题