4

struct Tree内に定義されているがありますClass Parser。入力として受け取るメソッドが定義されParserTreeいます。

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

すべてが正常に機能しているように見えました。しかし、それから私Treeはクラスの外で使う必要がありました。そこでstruct Tree、別のヘッダーで定義することにしました。このヘッダーをのヘッダーファイルにインクルードしましたParser。パーサーのヘッダーファイルにエラーは表示されませんが、ソースファイルにEclipseのエラーが表示されます。メソッドを指すメンバー宣言が見つからないと言いInputTreeます。

私の質問は、最初に、これは別のヘッダーで構造体を定義するための正しい戦略ですか?第二に、私は何が間違っているのですか?enum第三に、クラス間で使用したいタイプもいくつかあります。どこで定義しますか?

4

3 に答える 3

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.hstruct Treeメインのコンパイルユニットで使用できます。

于 2013-03-10T20:40:51.387 に答える
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

/ * 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)
{

}
于 2013-03-10T21:10:09.713 に答える
2

はい、別のヘッダーファイルで構造体を定義するのは正しい戦略です。

あなたが間違っていることは、それ以上の入力なしに言うのは難しいです-しかし、それはおそらくインクルード、インクルードガード、または名前空間の不一致に関係しています。

そして最後に、適切なインクルードガードを使用して、別のヘッダーファイルで列挙型を宣言する必要があります。

于 2013-03-10T20:43:33.770 に答える