2016-10-25 7 views
0

私はC++を学び、現在のクラスに別のクラスを組み込む方法を混乱させています。たとえば、私はclass QuackBehavior#include <QuackBehavior.h>に等しいかどうか疑問に思っています。それらが等しい場合、これらの2つの方法の違いは何ですか?コードはクラスファイルに別のクラスを含める方法

#include <string> 

class QuackBehavior; 

class Duck { 
public: 
    Duck(); 
    virtual ~Duck() {}; 

    virtual void performQuack(); 

    virtual std::string getDescription() = 0; 

    std::string getName() {return m_name;} 
    void setName(std::string name) {m_name = name;} 
    void setQuackBehavior(QuackBehavior * behavior); 

protected: 
    std::string m_name; 
    QuackBehavior * m_quackBehavior; 

}; 

ありがとうございます。

+2

'class QuackBehavior;'行は前方宣言です - 'QuackBehavior'というクラスがあります。 'Class Duck'のクライアントは、' 'を含めずにコンパイルするだけで十分です。コンパイルを高速化します。しかし、それは、クワック動作を実装するのには十分ではありません。 –

+1

これは前方宣言を理解するのに役立ちます:http://stackoverflow.com/questions/4757565/c-forward-declaration –

+0

@JonathanLeffler意味があります。どうもありがとうございます。 –

答えて

1

2が等しくない見つけることができるようにする#include「QuackBehavior.h」を使用する必要があります。

class QuackBehavior;は前方宣言とみなされ、QuackBehaviorというclassがあることをコンパイラに通知するだけです。あなたはポインタや参照などQuackBehaviorを使用している場合にのみ使用できます。

class B; 
struct C; 
struct A 
{ 
    shared_ptr<B> getB() const { return b; } 
    const C& getC() const; 
private: 
    shared_ptr<B> b; 
}; 

はここで、コンパイラは、彼らが存在することだけが、CBのいずれかの実装の詳細を知る必要はありません。コンパイラにclassstructかどうかを伝えることが重要です。

#include <QuackBehavior>はインクルードファイルであり、基本的にファイル全体をファイルにコピー&ペーストします。これにより、コンパイラとリンカはQuackBehaviorのすべてを見ることができます。これを行うには、QuackBehaviorに含まれるものすべてとそのすべてのファイルが含まれるため、処理が遅くなります。これにより、コンパイル時間が劇的に増加する可能性があります。

どちらも異なっており、両方が自分の場所を持っている:使用前方宣言あなたが例えば、ポインタでの使用(それらが存在することだけが、まだクラスの実装の詳細を知る必要はありません

  • オブジェクトを宣言している場合や、関数またはクラスのメンバーを使用する必要がある場合は、ファイルをインクルードします。
1

QuackBehavior.hファイルでは、QuackBehaviorクラスを宣言するだけで十分です。

#include <string> 

class QuackBehavior; // tells the compiler that a class called QuackBehavior exists without any further elaborations 

class Duck { 
public: 
    Duck(); 
    virtual ~Duck() {}; 

    virtual void performQuack(); 

    virtual std::string getDescription() = 0; 

    std::string getName() {return m_name;} 
    void setName(std::string name) {m_name = name;} 
    void setQuackBehavior(QuackBehavior * behavior); 

    protected: 
    std::string m_name; 
    QuackBehavior * m_quackBehavior; 
}; 

しかしQuackBehavior.cppファイルで、あなたはコンパイラが実装メンバ関数が

#include <QuackBehavior.h> 
#include <string> 
duck::duck() 
{ 
} 
関連する問題