我在struct Tree
内定义了Class Parser
。我在Parser
中定义了以Tree
作为输入的方法。
void Parser::InputTree(const Tree& input) {
//uses data from Tree
}
一切似乎都很好。但后来我需要在课堂外使用Tree
。所以我决定在单独的标题中定义struct Tree
。我将此标头包含在Parser
的标头文件中。虽然我在Parser的头文件中看不到任何错误,但源文件在我的Eclipse上显示错误。说未找到成员声明指向方法InputTree
。
我的问题是,首先,这是在单独的标头中定义结构的正确策略吗?第二,我做错了什么?第三,我也有一些enum
类型,我想跨类使用。我在哪里定义它?
答案 0 :(得分:3)
正确的结构:
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
在主编译单元中可用。
答案 1 :(得分:3)
我通常遵循的一个简单的经验法则是,如果只在一个类中使用自定义数据类型(即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)
{
}
答案 2 :(得分:2)
是的,在单独的头文件中定义结构是一种正确的策略。
如果没有更多的输入,你做错了很难说 - 但它可能与包含,包含保护或命名空间不匹配有关。
最后,您应该在另一个头文件中声明枚举,并使用正确的包含警卫。