在类文件中包含其他类的方法
The ways to include another classes in a class file
我正在学习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;
};
这里编译器不需要知道C
和B
的任何实现细节,只需要知道它们的存在。注意,告诉编译器它是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()
{
}
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GlobalAlloc而不是其他分配方法
- 让bool方法返回其他整数
- 还有其他方法可以在数组中写入多维数组吗?
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- Unity3d 中还有其他方法可以访问设备相机吗?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 继承构造函数和其他变量的解决方法
- 还有其他方法可以为乘法表编写循环以获取运行时值吗?
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 如何使 extern 方法在共享库中定义,但使用 cmake 在其他目标中声明?
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 将指针类方法作为参数传递给其他类方法C
- 如何为其他类成员函数编写模板包装方法
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- 当从其他方法返回 vector 时,C++无法访问矢量元素
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 如何使用Python脚本或其他一些方法来美化所有文件