首页 > 解决方案 > 在调用其中声明的方法时是否应该包含文件?

问题描述

抱歉,我讨厌问这么简单的问题,但我没有找到答案,可能是因为我不知道如何简洁地描述这个问题。

假设你有一个class X,并且想在z.cc.

例如

// 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();
}

标签: c++

解决方案


在调用其中声明的方法时是否应该包含文件?

是的。

但是如果你想调用一个方法 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. 但实际上,声明具有此类参数的函数不需要定义。


推荐阅读