在类文件中包含其他类的方法

时间:2016-10-25 05:14:44

标签: c++

我正在学习c ++并且对在当前类中包含另一个类的方法感到困惑。例如,我想知道class QuackBehavior是否等于#include <QuackBehavior.h>。如果他们是平等的,这两种方式之间有什么区别?代码是:

#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 个答案:

答案 0 :(得分: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 <QuackBehavior.h> 
#include <string>
duck::duck()
{
}

答案 1 :(得分:1)

两者不相等:

class QuackBehavior;被视为前向声明,只是通知编译器有一个名为class的{​​{1}}。只有在使用QuackBehavior作为指针或引用时才能使用此选项:

QuackBehavior

此处编译器不需要知道class B; struct C; struct A { shared_ptr<B> getB() const { return b; } const C& getC() const; private: shared_ptr<B> b; }; C的任何实现细节,只需知道它们存在。请注意,告诉编译器它是B还是class是很重要的。

struct是一个包含,实质上是将整个文件复制+粘贴到您的文件中。这允许编译器和链接器查看有关#include <QuackBehavior>的所有内容。执行此操作的速度较慢,因为您将包含QuackBehavior包含的所有内容以及这些文件包含的所有内容。这会大大增加编译时间。

两者都不同,两者都有自己的位置:

  • 当您不需要知道类的实现细节时,使用forward-declaration,只有它们存在(例如在指针和引用中使用)
  • 如果要声明对象,则包含该文件,或者您需要使用函数或类的成员。