单独的头文件中的struct导致C ++出现问题

时间:2013-03-10 20:35:36

标签: c++ struct enums function-declaration

我在struct Tree内定义了Class Parser。我在Parser中定义了以Tree作为输入的方法。

void Parser::InputTree(const Tree& input) {
//uses data from Tree
}

一切似乎都很好。但后来我需要在课堂外使用Tree。所以我决定在单独的标题中定义struct Tree。我将此标头包含在Parser的标头文件中。虽然我在Parser的头文件中看不到任何错误,但源文件在我的Eclipse上显示错误。说未找到成员声明指向方法InputTree

我的问题是,首先,这是在单独的标头中定义结构的正确策略吗?第二,我做错了什么?第三,我也有一些enum类型,我想跨类使用。我在哪里定义它?

3 个答案:

答案 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)

是的,在单独的头文件中定义结构是一种正确的策略。

如果没有更多的输入,你做错了很难说 - 但它可能与包含,包含保护或命名空间不匹配有关。

最后,您应该在另一个头文件中声明枚举,并使用正确的包含警卫。