2017-04-04 6 views
0

クラス内から別のファイルで定義された構造体を指すことはできますか?別のファイルで定義されている構造体へのポインタ

私は以下のコードのようにそれを試してみましたが、このエラーを取得:

cannot convert 'main()::list*' to 'entry::list*' in assignment

はmain.cppに:

#include "entry.h" 
#include <vector> 

int main() 
{ 

struct list 
{ 
    std::vector<entry*> entryVector; 
    int temp; 
}; 

list A; 
entry B; 

B.ptrToStruct = &A; 


return 0; 
} 

entry.h:

#ifndef ENTRY_H 
#define ENTRY_H 
#include <string> 

class entry 
{ 
public: 

    struct list; //prototype does not work 

    std::string text; 
    struct list* ptrToStruct; 

}; 

#endif // ENTRY_H 

私もしてみましたこのようなプロトタイプを書く:

struct main::list; 

"main 'が宣言されていないため、これは動作しませんでした。

+2

まず、あなたの用語について少し注意してください。*プロトタイプ*は関数の前方宣言です。あなたの 'entry'クラスでやっていることは、単に' entry :: list'クラスを宣言することです。あなたの問題について:いいえ、他のスコープの関数でローカルに宣言または定義されたシンボルにアクセスすることはできません。 –

+1

ところで、アイテムを相互にリンクさせるのは少し珍しいことです。それぞれの 'entry'が' list'によって所有されている場合、それが属するリストを追跡しなければならないのはなぜですか?エントリの追加と削除は複雑になります。 –

+0

設定メニュー用です。エントリは実行時に変更されません。 ptrToStructがそのメニューエントリのサブメニューを指すようにする必要があります。 私の構造体は、エントリのベクトルを保持する私のリストです。これらのエントリの中にはサブリストがあります。それで私はポインタが必要なのです。構造体には、選択されたエントリを保存するintも保持されます。 私はこれが最良の方法ではないと感じています。私はヒントのためにオープン! –

答えて

2

これは範囲です。 entry::listentry::listのをentryの中に宣言したとき。

グローバルタイプlistが必要な場合は、struct list;をクラス外のグローバルスコープに移動する必要があります。

mainの宣言で同じことをしたい場合があります。

+0

ありがとうございます。グローバル変数は悪いスタイルですが、そうですか? –

+0

はい、グローバル変数はグローバルタイプよりも複雑です。 –

+0

申し訳ありませんが、グローバルタイプはどういう意味ですか? 構造体の定義を別々の.hファイルに入れ、それを私のmain.cppとentry.hに含めるとどうなりますか?それは良いでしょうか? –

関連する問題