结构在单独的头文件中导致c++中的问题

struct in separate header file causing problems in C++

本文关键字:c++ 问题 文件 单独 结构      更新时间:2023-10-16

我有一个在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保护符