【C++】C++中前置声明的应用与陷阱_前置生命如何使用-CSDN博客
首先,这样写会报错:
#pragma once
#include "A.h"
class B
{A a;
public:B(void);~B(void);
};
#include "B.h"
B::B(void)
{
}B::~B(void)
{
}
#pragma once
#include "B.h"
class A
{B b;
public:A(void);virtual ~A(void);
};
#include "A.h"A::A(void)
{
}A::~A(void)
{
}
这么写依然不行:
#pragma onceclass A;
class B
{A a;
public:B(void);~B(void);
};
#include "B.h"
#include "A.h"
B::B(void)
{
}B::~B(void)
{
}
#pragma onceclass B;
class A
{B b;
public:A(void);virtual ~A(void);
};
#include "A.h"
#include "B.h"
A::A(void)
{
}A::~A(void)
{
}
这样写可以:
#pragma onceclass B;
class A
{B* b;
public:A(void);virtual ~A(void);
};
#pragma onceclass A;
class B
{A*a;
public:B(void);~B(void);
};
在头文件中,不用使用
A a;
可以使用
A *a;
指针类型的大小是固定的。
也可以使用引用:
A& a;
但我没有怎么使用过引用。
错误示例:
在B的声明中使用A的方法
#pragma onceclass A;
class B
{A* a;
public:B(void);~B(void);void xxx() {a->mmm();}
};
解决方法:把xxx函数在.cpp中进行实现。
使用前置声明可以减少头文件中包含头文件,也就减少了.cpp文件中包含不必要的头文件。
可以一定程度地提高编译速度。
反证:
a.h中:包含b.h,c.h,d.h
b.h中: 包含e.h,f.h,g.h
如果a.cpp中不需要e.f,f.h,g.h,那么a.cpp文件中就包含了不必要的头文件。