应该在哪里声明类对象?
它们是否应该在.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所示?
这些例子全部都是针对不同的使用情况:
A.h
#include "B.h"
#include "C.h"
class A
{
void someFunction();
B b;
C c;
}
这分别增加了对象b
和类型B
c
和C
您A
类。任何A
类型的对象现在都可以访问这2个其他对象。 (只是不在课堂之外,因为他们是隐含的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()
中定义它们。
如果说,A和B中的函数都在改变C类中成员的值,但是它们所做的更改必须在函数外部可见?我应该在C中使用'static'声明还是使用b.c.set()? – C3PO
@ C3PO恐怕我们在这里有一种[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。我建议你也许会提出一个新的问题来解决你面临的实际问题,而不是一些抽象的问题。看起来你只需要通过引用该函数来传递一个'C'实例就可以在该函数外部看到更改,但我可能错了 – user463035818
@ tobi303谢谢。我会看看那个 – C3PO
尽可能地用最窄的范围声明它们。如果class
仅用于单个翻译单元中,则声明和将其定义为它在源文件中。通常,只有声明 a class
在头文件中,如果声明是多个转换单元所需的。
处理循环依赖的正常方式是使用转发类声明。
示例1不是其他两种的替代方案(实际上所有三种都是完全不同的情况),我也没有在那里看到循环依赖。 – user463035818
也许[这些**中的一个](https://stackoverflow.com/search?q=%5Bcpp%5D+circular+dependency)涵盖了你缺少的东西。你看起来了吗? – WhozCraig
@ tobi303你能否解释何时或是否应该使用这些情况? – C3PO