在实现文件中定义const

Defining const in implementation file

本文关键字:定义 const 文件 实现      更新时间:2023-10-16

我有以下代码:

foo:

include "Bar.h"
class Bar;
class Foo {
   const Bar mBar;
public:
   Foo(const Bar &bar);
};

Foo.cpp:

#include "Foo.h"
Foo::Foo(const Bar &bar) : mBar(bar) {}

我收到以下编译错误:

'Foo::mBar'使用未定义的类'Bar'

在实现文件中不允许const定义吗?

显然,在这种情况下,我可以将函数实现移到头文件中。

但是如果我想调用Bar函数,它可能需要前向声明的参数而不是复制函数,并且仍然保持Bar成员变量不变,那么有什么替代方法呢?例如:

foo:

include "Bar.h"
class Bar;
class BaraParams;
class Foo {
   const Bar mBar;
public:
   Foo(const BarParams &barParams);
};

Foo.cpp:

#include "Foo.h"
Foo::Foo(const BarParams &barParams) : mBar(barParams) {} //call bar ctor

Bar.h:

include "BarParams.h"
class Bar{
public:
   Bar(const BarParams &barParams);
};

还是我做得不对?我都不知道这是不是个好主意

头文件必须包含Bar头文件。完整的内容是这样的:

include "Bar.h"
class Foo {
   const Bar mBar; 
   //because it is Bar and not Bar& or Bar* forward declarations are not possible
public:
   Foo(const Bar &bar);
};

你可以而且应该在以下情况下使用前向声明

class Foo {
   const Bar& mBar; 
public:
   Foo(const Bar &bar);
};

但是Bar include必须存在于实现文件中。
同样的推理可以应用在这里,而不是这个:

include "BarParams.h"
class Bar{
public:
   Bar(const BarParams &barParams);
};

do this:

class BarParams;
class Bar{
public:
   Bar(const BarParams &barParams);
};

这样做可以避免不必要的包括所有的头文件,并使编译器的工作更容易。在大型项目中,编译时间可以显著减少。