c++ - 在调用其中声明的方法时是否应该包含文件?
问题描述
抱歉,我讨厌问这么简单的问题,但我没有找到答案,可能是因为我不知道如何简洁地描述这个问题。
假设你有一个class X
,并且想在z.cc
.
- 我知道如果你希望有一个类型的字段或参数,你应该包括在内
x.h
,以便编译器知道该字段或参数需要多少空间。z.cc
X
- 我知道如果您希望有一个类型的字段或参数,您应该转发声明 ,以便编译器清楚该类将被声明,但不需要知道需要多少空间。
class X
X*
X
- 但是如果你想调用一个方法
X::doX()
呢?这是否需要包含、前向声明或两者都不需要?Unused "#include "x.h""
在这种情况下,我的 IDE 告诉我。
例如
// x.h
class X {
void doX() {}
}
// y.h
#include "x.h"
class Y {
X getX() {return {};}
}
// z.cc
#include "y.h"
/* Which, if either, line is recommended:
#include "x.h"
class X;
*/
void useX(Y y) {
auto x = y.getX();
x.doX();
}
解决方案
在调用其中声明的方法时是否应该包含文件?
是的。
但是如果你想调用一个方法 X::doX() 呢?这是否需要包含、前向声明或两者都不需要?
需要定义类来调用类的成员函数。
自动类型推导可以轻松隐藏我们依赖的类型。如果我们重写:
auto x = y.getX();
显式使用auto
将被推断为的类型:
X x = y.getX();
我们现在可以很容易地看到我们定义了一个类型的变量X
,所以很明显我们依赖于 的定义X
。
我们应该避免依赖传递包含,因此我们应该直接包含定义X
. 一个例外可能y.h
是明确记录定义X
的情况,在这种情况下y.h
,应该知道给定保证的作者应该知道不违反该保证,从而使传递包含更安全。
我知道如果您希望拥有 X 类型的字段或参数,您应该在 z.cc 中包含 xh
准确地说,我们不需要定义 ofX
来声明一个带有 type 参数的函数X
。一个声明就足够了。X
在定义参数类型为 的函数时,我们确实需要定义X
。同样适用于返回类型。
我知道如果您希望拥有 X* 类型的字段或参数,您应该转发声明类 X
请注意,在定义参数类型为 的函数时X*
,很典型的情况是我们可能需要通过指针间接或将其转换为与 相关的另一种指针类型X
,在这种情况下我们确实需要定义X
. 但实际上,声明具有此类参数的函数不需要定义。
推荐阅读
- excel - Print path of input file
- ios - Swift iOS 系统通知解除回调
- c# - 如何从 GitLab 项目中获取特定的提交
- c# - 如何解决显示弹出窗口的问题?
- java - 运行服务器时,我的插件没有出现在 minecraft (Intellij)
- ruby-on-rails - 在 RoR 应用程序 configuration.yml 中使用 ActionMailer default_options "from"
- python-3.x - 如何打破 Django 模板中的“for循环”
- node.js - 更改 AWS Elastic Beanstalk (Nginx) 上的文件上传大小限制
- css - 高度设置为 0 的全高弹性项目
- powershell - 从 PowerShell 将布尔值传递给 .net 函数