2017-02-05 9 views
2

私は下のクラスの中でフレンド関数を宣言しました。フレンド関数を使用して別のクラスのプライベートメンバーを反復する

クラスモデルは

#include "fileio.h" 
class fileio; 
class model 
{ 
    std::vector<element>m_elements; 
    public: 
    friend void fileio::element_iterator(); 
} 

element_iterator()class fileioのパブリック関数です。

#include "model.h" 
class model; 
class fileio 
{  
    model* m_model; 
    public: 
    fileio(model*); 
    void element_iterator(); 
} 

element_iterator()関数は以下のように定義されるFILEIOクラス。

void fileio::element_iterator() 
{ 
    for(auto &iter : m_model->m_elements) 
    { 
     //some functions 
    } 
} 

フレンド機能を使用して別のクラスからm_elementsを繰り返していきたいと思います。しかし、私は以下のようにエラーを取得しています:

エラー:

model.h : error: invalid use of incomplete type 'class fileio' 
friend void fileio::read_boundary(); 

model.h : error: forward declaration of 'class fileio' 
class fileio; 

modell.h : In member function 'void fileio::read_boundary()': 

cmodel.h : error: 'std::vector<element> model::m_elements' is private 
std::vector<element>m_elements; 

fileio.cpp: error: within this context 
for(auto iter:m_model->m_elements) 

EDIT

:fileio.hで class modelの前方宣言がなければ
は以下のようにエラーの別のセットを提供します
error: 'model' has not been declared 
fileio(model*); 

error: 'model' does not name a type  
     model* m_model; 

candidates are: 
    fileio::fileio(int*) 
    fileio(model*); 
     no known conversion for argument 2 from 'model*' to 'int*' 

友達の関数宣言とその定義をコメントアウトすると、プログラムはエラーなく実行されます。 どうすれば解決できますか?

+0

あなたはだけでなく、 'クラスFILEIOの'の#include "fileio.hを" '必要があります。' 'model.h'に。 – songyuanyao

+0

編集について: 'fileio.h'でも' class model; 'を削除しましたか? – songyuanyao

+0

@songyuanyaoは、両方の方法を試しました。何も違いはありませんでした – hisham

答えて

2

の代わりにfileiomodel.hの代わりに、完全定義を含みます。

// fileio.h 
class model; 
class fileio 
{ 
    model* m_model; 
    public: 
    void element_iterator(); 
}; 

// model.h 
#include "fileio.h" 
class model 
{ 
    std::vector<int >m_elements; 
    public: 
    friend void fileio::element_iterator(); 
}; 

wandbox example


また、あなたは全体fileioクラスfriend作ることができる - これはあなたがかもしれないその前方宣言を、使用することができますがあなたの実際の状況に応じてあなたが望むもの。

// model.h 
class fileio; 
class model 
{ 
    std::vector<int >m_elements; 
    public: 
    friend class fileio; 
}; 

// fileio.h 
class model; 
class fileio 
{ 
    model* m_model; 
    public: 
    void element_iterator(); 
}; 

wandbox example

+0

モデルクラスを友人クラスとしてfileioクラスに宣言すると、プログラムはうまく動作します。しかし、なぜ私は友人機能を使用できないのですか? – hisham

関連する問題