4

我有一个struct Tree在里面定义的Class Parser。我有其中定义的方法Parser作为Tree输入。

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

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

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

4

3 回答 3

3

我通常遵循的一个简单的经验法则是,如果自定义数据类型(即结构、枚举等)仅在类中使用,我最终会在类的定义中定义此数据类型。

但是,如果需要在 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

/* 解析器.h */

#ifndef PARSER_H
#define PARSER_H

#include "MyNamespace.h"

class Parser
{
public:
    void InputTree(const MyNamespace::Tree& input);
};

#endif

/* 解析器.cpp */

#include "Parser.h"

void Parser::InputTree(const MyNamespace::Tree& input)
{

}
于 2013-03-10T21:10:09.713 回答
3

正确的结构:

解析器.h

#ifndef _PARSER_H_
#define _PARSER_H_
#include "tree.h"
class Parser {
   void InputTree(const Tree& input);
};

#endif /*_PARSER_H_*/

解析器.cpp

#include "parser.h"
void Parser::InputTree(const Tree& input){
 // use data from Tree
}

树.h

#ifndef _TREE_H_
#define _TREE_H_

struct Tree {
   //nodes
};
#endif /*_TREE_H_*/

包括parser.h包含tree.h,因此struct Tree在主编译单元中可用。

于 2013-03-10T20:40:51.387 回答
2

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

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

最后,您应该在另一个头文件中声明枚举,并使用适当的包含保护。

于 2013-03-10T20:43:33.770 回答