2016-09-27 3 views
2

次のエラーが表示されます。すべてのクラスで 'class name' does not name a typeです。 私はそれが循環依存であるかもしれないと思うが、各クラスが次の関数からのアクセスを必要とするので、どのようにそれを解決するかという手がかりはない。以下は、私のクラスは次のとおりです。"タイプに名前を付けない"エラーを解決する方法

Container.h:

#ifndef CONTAINER_H 
#define CONTAINER_H 

#include "Factory.h" 

class Container 
{ 
public: 
    Container() 
    { 
     array = new int[10]; 
     for (int i = 0; i < 10; ++i) { 
      array[i] = i; 
     } 
    } 
    Iterator* createIterator() 
    { 
     Factory fac; 
     return fac.factoryMethod(); 
    } 
    friend class Iterator; 

private: 
    int* array; 
}; 

#endif //CONTAINER_H 

Factory.h:

#ifndef FACTORY_H 
#define FACTORY_H 

#include "Iterator.h"; 

class Factory 
{ 
    Iterator* factoryMethod(Container* con) 
    { 
     return new Iterator(con); 
    } 
}; 

#endif //FACTORY_H 

Iterator.h:

#ifndef ITERATOR_H 
#define ITERATOR_H 

#include "Container.h" 

class Iterator 
{ 
public: 
    Iterator(Container* con) 
    { 
     this->con =con; 
    } 
    int getFromIndex(int i) 
    { 
     return con->array[i]; 
    } 
private: 
    Container* con; 
}; 

#endif //ITERATOR_H 

main.cppに:

#include <iostream> 
using namespace std; 

#include "Container.h" 
#include "Iterator.h" 

int main() { 
    Container con; 
    Iterator* it = con.createIterator(); 
    cout<<it->getFromIndex(2)<<endl; 

    return 0; 
} 

ご協力いただきありがとうございます。

+2

.cppファイルに関数本体を配置します。 – Dan

+0

@ダンこれを試してみましたが、デモンストレーション目的でインラインで置いてください。 – Keagansed

答えて

6

実際にはヘッダー間の循環依存関係です。 Container.hFactory.hを含み、Iterator.hを含み、Container.hを含む。

解決策は、メンバー関数の実装をヘッダーファイルからソースファイルに移動することです。

class Iterator; 

class Container 
{ 
public: 
    Container(); 
    Iterator* createIterator(); 
    friend class Iterator; 

private: 
    int* array; 
}; 

次に、(例えばContainer.cppなど)は、適切なソースファイルに:その方法は、ヘッダファイルだけで、簡単にヘッダファイルを「消費する」に直接置くことができ、クラスの宣言ではなく、定義を、必要になります、メンバ関数を実装し、必要な任意のヘッダを含める:

Container.cpp

#include "Container.h" 
#include "Factory.h" 

Container::Container() : array(new int[10]) 
{ 
    for (int i = 0; i < 10; ++i) { 
     array[i] = i; 
    } 
} 

Iterator* Container::createIterator() 
{ 
    Factory fac; 
    return fac.factoryMethod(); 
} 

クールのFactoryIteratorについて(Dtto、 se)。

最後のバイナリをビルドするときに、すべてのソースファイルをリンクすることを忘れないでください。

+0

助けてくれてありがとう、これはうまくいった。 – Keagansed

1

Danが述べたように、関数本体は.cppファイル(異なる翻訳単位)に入れてください。

また、型へのポインタのみを使用している場合は、#includeにする必要はありません。ちょうど前方宣言をしてください。

+0

ありがとう、これは働いた。 – Keagansed

関連する問題