2016-09-23 116 views
-1

它们是否应该在.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不是其他两种的替代方案(实际上所有三种都是完全不同的情况),我也没有在那里看到循环依赖。 – user463035818

+0

也许[这些**中的一个](https://stackoverflow.com/search?q=%5Bcpp%5D+circular+dependency)涵盖了你缺少的东西。你看起来了吗? – WhozCraig

+0

@ tobi303你能否解释何时或是否应该使用这些情况? – C3PO

回答

1

这些例子全部都是针对不同的使用情况:

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

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

这分别增加了对象b和类型BcCA类。任何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. 
} 

这通常是最好的情况时,你只需要使用bcsomeFunction及其变化不必是函数的外部可见。请注意,它们的生命周期直到函数结束。

例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()中定义它们。

+0

如果说,A和B中的函数都在改变C类中成员的值,但是它们所做的更改必须在函数外部可见?我应该在C中使用'static'声明还是使用b.c.set()? – C3PO

+0

@ C3PO恐怕我们在这里有一种[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。我建议你也许会提出一个新的问题来解决你面临的实际问题,而不是一些抽象的问题。看起来你只需要通过引用该函数来传递一个'C'实例就可以在该函数外部看到更改,但我可能错了 – user463035818

+0

@ tobi303谢谢。我会看看那个 – C3PO

1

尽可能地用最窄的范围声明它们。如果class仅用于单个翻译单元中,则声明和将其定义为它在源文件中。通常,只有声明 a class在头文件中,如果声明是多个转换单元所需的。

处理循环依赖的正常方式是使用转发类声明

相关问题