应该在哪里声明类对象

Where should class objects be declared?

本文关键字:对象 声明 在哪里      更新时间:2023-10-16

它们应该在.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那样在头include下的文件顶部声明?

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

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.
}

当您只需要在someFunction中使用bc并且它们的更改不必对函数外部可见时,这通常是最好的场景。注意,它们的生命周期直到函数结束为止。

示例3:

A.cpp
#include "B.h"
#include "C.h"
B   b;
C   c;
A::someFunction()
{
    // Do something with b and c.
}

这里,bc都是全局变量,全局变量通常不受欢迎,因为它们很难跟踪代码的哪一部分对这些变量做了什么修改。一个更好的选择是传递它们并在main()中定义它们,如果它们的生命周期应该是整个程序。

尽可能用最窄的范围声明它们。如果class仅在单个翻译单元中使用,则在源文件中声明并定义它。通常,只有在多个事务单元需要声明class时,您才会在头文件中声明

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