是否应在.cpp
或.h
文件中声明?
示例1:
A.h
#include "B.h"
#include "C.h"
class A
{
void someFunction();
B b;
C c;
}
示例2:
A.cpp
#include "B.h"
#include "C.h"
A::someFunction()
{
B b;
C c;
// Do something with b and c.
}
示例3:
A.cpp
#include "B.h"
#include "C.h"
B b;
C c;
A::someFunction()
{
// Do something with b and c.
}
它们是否只能在使用它们的函数中声明(例2),还是可以在头文件的顶部声明它们,如示例3所示?
答案 0 :(得分:1)
尽可能用最窄的范围声明它们。如果class
仅用于单个翻译单元,则在源文件中声明并定义。通常情况下,如果多个转换单元需要声明,您只能在头文件中声明 class
。
处理循环依赖的常规方法是使用前向类声明。
答案 1 :(得分:1)
所有这些示例都针对不同的用例:
A.h
#include "B.h"
#include "C.h"
class A
{
void someFunction();
B b;
C c;
}
这会将类型b
和c
的对象B
和C
分别添加到您的班级A
。任何类型为A
的对象现在都可以访问这两个其他对象。 (因为他们是非常的private
),所以不在课堂之外。这与示例2& 3因为在实例化A
的对象之前它实际上并没有定义任何变量。
示例2:
A.cpp
#include "B.h"
#include "C.h"
A::someFunction()
{
B b;
C c;
// Do something with b and c.
}
这通常是您只需要在b
内使用c
和someFunction
的最佳方案,并且他们的更改不必在函数外部可见。请注意,它们的生命周期一直持续到函数结束。
示例3:
A.cpp
#include "B.h"
#include "C.h"
B b;
C c;
A::someFunction()
{
// Do something with b and c.
}
这里,b
和c
都是全局变量,全局变量通常是frowned upon,因为它们很难跟踪代码的哪些部分正在对这些变量进行哪些修改。如果他们的生命周期应该是整个程序的话,那么更好的选择是传递它们并在main()
中定义它们。