我正在学习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;
};
非常感谢你。
答案 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
包含的所有内容以及这些文件包含的所有内容。这会大大增加编译时间。
两者都不同,两者都有自己的位置: