应该在哪里声明类对象?

时间:2016-09-23 09:15:18

标签: c++ class

是否应在.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所示?

2 个答案:

答案 0 :(得分:1)

尽可能用最窄的范围声明它们。如果class仅用于单个翻译单元,则在源文件中声明并定义。通常情况下,如果多个转换单元需要声明,您只能在头文件中声明 class

处理循环依赖的常规方法是使用前向类声明

答案 1 :(得分:1)

所有这些示例都针对不同的用例:

A.h
#include "B.h"
#include "C.h"

class A
{
    void someFunction();
    B   b;
    C   c;
}

这会将类型bc的对象BC分别添加到您的班级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内使用csomeFunction的最佳方案,并且他们的更改不必在函数外部可见。请注意,它们的生命周期一直持续到函数结束。

示例3:

A.cpp
#include "B.h"
#include "C.h"

B   b;
C   c;

A::someFunction()
{
    // Do something with b and c.
}

这里,bc都是全局变量,全局变量通常是frowned upon,因为它们很难跟踪代码的哪些部分正在对这些变量进行哪些修改。如果他们的生命周期应该是整个程序的话,那么更好的选择是传递它们并在main()中定义它们。

相关问题