我有一个B类,我想把成员称为A类.所以:
1.
//A.h
class B;
class A
{
private:
B* m_p;
};
//a.cpp
#include "B.h"
Run Code Online (Sandbox Code Playgroud)
2.
// A.h
#include "B.h"
class A
{
private:
B * impl_;
};
Run Code Online (Sandbox Code Playgroud)
当一个没有太多依赖性的小项目涉及时,这两种方式是否更好?
jog*_*pan 33
你做的第一种方式是指在a.h中,存在的class B是已知的,但不是它的定义.这限制了你可以用B内部做什么a.h.例如,您可以拥有类型的变量B *,但不能具有类型的变量B(因为对于类型变量的声明,B编译器必须能够看到完整定义B).此外,如果您有类型的变量B *,则不能取消引用指针(因为这样,B必须知道定义).
因此,您的第二选择 - 没有这些问题 - 是首选,这是大多数人大多数时间使用的.
这是第一种方法可能有用的特殊情况.例如:
.h文件互相包含(但是你可能会遇到一些其他的问题,也就是包含防范问题;这通常很难并且要避免);b.h非常大且复杂,那么您希望尽可能避免包含它,因为它会降低编译过程的速度.mad*_*tya 17
你的第一种方法是前瞻性声明.你的第二个实际上包括B班.
何时使用一个而不是另一个?
And*_*olk 11
答案:1.
看看http://www.umich.edu/~eecs381/handouts/handouts.html
C头文件指南
C++头文件指南(密歇根大学EECS部门David Kieras)说:
准则#10.如果X类型的声明不完整,请使用它而不是#including其标题Xh.如果另一个结构或类类型X在头文件的内容中仅作为指针或引用类型出现,那么你不应该#include Xh,而只是在附近放置一个不完整的X声明(也称为"前向"声明).标题文件的开头,如下所示:
class X;有关这一功能强大且有价值的技术的更多讨论,请参阅讲义 不完整声明.请注意,标准库包含一个不完整声明的标题,这些声明通常用于<iostream>命名库的库<iosfwd>.<iosfwd>尽可能#include ,因为<iostream>标题文件非常大(巨型模板!).
| 归档时间: |
|
| 查看次数: |
18792 次 |
| 最近记录: |