在实现文件中定义const
Defining const in implementation file
我有以下代码:
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);
};
这样做可以避免不必要的包括所有的头文件,并使编译器的工作更容易。在大型项目中,编译时间可以显著减少。
相关文章:
- 在运算符重载定义中使用成员函数(const错误)
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何定义在编译时数据未知的 const 数组
- 具体来说,标准在哪里规定修改 const 对象是未定义的行为?
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何键入用于const对象的自定义io操纵器
- 正在通过const-ref未定义的行为捕获新构造的对象
- 自定义链表const_iterator无法遍历列表的非const实例
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 在源文件中定义 const 数组
- 为什么全局定义"const Date default_date(1970,1,1);"不好?
- 支持自定义 const 本机C++容器类的"for each"
- 如何在头文件中定义const-static std::string
- 在头文件中定义const对象
- 在实现文件中定义const
- 定义const列表
- 如何在C++中的配置文件中加载自定义"const"变量?