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

The ways to include another classes in a class file

本文关键字:方法 其他 文件 包含      更新时间:2023-10-16

我正在学习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;
};

两者不相等:

class QuackBehavior;被认为是一个前向声明,它只是告诉编译器有一个class叫做QuackBehavior。这只能在使用QuackBehavior作为指针或引用时使用:

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

这里编译器不需要知道CB的任何实现细节,只需要知道它们的存在。注意,告诉编译器它是class还是struct也是很重要的。

#include <QuackBehavior>是一个包含,它将整个文件复制粘贴到文件中。这允许编译器和链接器看到关于QuackBehavior的一切。这样做比较慢,因为您将包含QuackBehavior包含的所有内容,以及这些文件包含的所有内容。这会大大增加编译时间。

都是不同的,都有它们的位置:

  • 当你还不需要知道一个类的实现细节时,使用前向声明,只需要知道它们的存在(例如在指针和引用中使用)
  • 如果你声明一个对象,或者你需要使用函数或类的成员,包括文件。

在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()
{
}
相关文章: