2016-10-20 9 views
0

私はそのようなコードを書きたいが、それは動作しません:前方宣言

struct ast; 
struct parser; 

struct parser 
{ 
    struct node 
    { 
     node *parent; 
    }; 

    ast build_ast() //here we want to use object of ast tyoe 
    { 
     node *ret = new node; 
     return ast(ret); 
    } 
}; 

struct ast 
{ 
    parser::node *root; //here we try to access member struct of y 
    ast(parser::node *rt):root(rt){} 
}; 

問題は、私は、パーサーに不完全な型のオブジェクトを作成しようということです。構造体の実装を入れ替えると、不完全な型のメンバstructにアクセスしようとするという問題があります。明らかに、私はノードを独立した構造にすることでこの問題を解決することができますが、それは私のプログラムに他のノードタイプを持たせたいので、悪いと思われます。 質問は、どういうわけか、ノード構造体の前方宣言をパーサー構造体の外に作ることができますか?例:

struct ast; 
struct parser; 
struct parser::node; //making a forward declaration of member struct 

これができない場合は、どのように競合を解決するのですか?あなたはastまでbuild_astの定義を延期する必要が

+0

あなたが前方node' '宣言したことはありません。 –

+0

は構造体のast build_ast()関数を宣言し、後で構造体astの後に定義するだけです。 – arayq2

+0

クラスの宣言と定義をそれぞれのヘッダーに入れ、 '.cpp'ファイルにメンバ関数を実装します。ここで適切なヘッダもインクルードする必要があります。 – Nawaz

答えて

0

は完全なタイプです:

inline ast build_ast(); //here we want to use object of ast type 

inlineあなたは一例で持っていたものに、この宣言は、機能的に同一にするためにここにあります。あなたはそれを削除し、構造体の定義の外で実装ファイル

build_astを移動することもできます。

ast parser::build_ast() 
{ 
    node *ret = new node; 
    return ast(ret); 
} 

nodeを転送-宣言するには、あなたはparser定義内でこれを実行する必要があります。言い換えると、外側を定義せずに内部クラスを前方宣言することはできません。

struct parser 
{ 
    struct node; 
    // ... 
}; 

その後、定義を続行することができます

struct parser::node 
{ 
    node *parent; 
};