前向声明/何时最好包含标头? [复制]

2024-01-05

我很清楚何时可以/不能使用前向声明,但我仍然不确定一件事。

假设我知道我迟早必须包含一个标头才能取消引用 A 类的对象。 我不清楚做类似的事情是否更有效。

class A;
class B
{
   A* a;
   void DoSomethingWithA();
};

然后在cpp中有类似的东西..

#include "A.hpp"
void B::DoSomethingWithA()
{
   a->FunctionOfA();
}

或者我是否可以首先将 A 的标头包含在 B 的头文件中? 如果前者更有效,那么如果有人清楚地解释原因,我将不胜感激,因为我怀疑它与编译过程有关,我总是可以通过了解更多信息来做到这一点。


尽可能使用前向声明(如您的示例中所示)。这减少了编译时间,但更重要的是最大限度地减少了不需要知道也不关心实现细节的代码的头文件和库依赖性。一般来说,除了实际实现之外,没有任何代码应该关心实现细节。

以下是谷歌对此的理由:头文件依赖关系 https://google.github.io/styleguide/cppguide.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前向声明/何时最好包含标头? [复制] 的相关文章

随机推荐

  • 如何解决从 Windows Azure Blob 存储服务返回的 InvalidMd5 错误?

    我正在构建一个应用程序 需要允许用户将大图像 最多约 100 MB 上传到 Windows Azure Blob 存储服务 读过罗布 吉伦的精彩文章 http rob gillenfamily net 2010 04 26 external
  • @Transactional Spring MyBatis 不工作

    我有一个 Spring Web 应用程序 一切都很好 但现在我需要一种方法来进行事务处理 这是我的 applicationContext xml
  • onbeforeunload 支持检测

    我想检查当前浏览器是否支持 onbeforeunload 事件 常见的 javascript 方法似乎不起作用 if window onbeforeunload alert yes else alert no 实际上 它只检查某个处理程序是
  • 非命名空间范围错误的显式专业化......迫切需要帮助

    有人可以帮我将以下代码移植到GCC 我在这个网站上发现了很多或相关的问题 但我似乎无法在我的案例中应用建议的解决方法 typedef float MyData attribute vector size 16 template
  • 我什么时候应该使用blockingGet?

    我在工作中经常使用 RxJava 并且看到了一些调用返回 Observable 或 Single 的方法的示例 然后在其上调用blockingGet 以在不同的 我认为这可能是对图书馆和概念的滥用 但我可能是错的 我举一个小例子 publi
  • 用于多处理日志记录的 QueueHandler

    我正在尝试调整我的程序以将不同进程记录到单个日志文件中 我已经寻找解决方案很多天了 但没有成功 我想我仍然不明白队列处理程序是如何工作的 在我看来 这个过程是这样的 create q 将 qHandler 添加到主记录器 所有日志都将重定向
  • Oracle 10g:解析合并重复项的2列

    我有一个包含 3 列的表 DATE A DATE B and ISSUE DATE A and DATE B可以通过 3 种可能的方式填写 要么两者都有一个值 要么只有一个有 如下所示 DATE A DATE B ISSUE 2013030
  • org.hibernate.ejb.criteria.path.Abs​​tractPathImpl.get 处的 NullPointerException [重复]

    这个问题在这里已经有答案了 这工作正常 public Predicate toPredicate Root
  • 如何将现有的heroku应用程序拉到新位置进行开发?

    目前 我在另一台计算机上有最新版本的代码 我想用它来开发 家用计算机和笔记本电脑 供我外出时使用 我在笔记本电脑上为我的应用程序设置了heroku 现在我需要将我的代码关联到桌面上 以便我也可以从那里推送到 heroku 这是我从桌面上得到
  • 使用scala获取包中的所有类名

    我有一个包裹 package one two three 在那个包裹里我有 public trait first public class Second and pubic class Third 我想将所有类和接口 一 二 三 名称获取为
  • 如何将 CSV 文件中的批量数据导入到 DynamoDB 中?

    我正在尝试将 CSV 文件数据导入 AWS DynamoDB 我的 CSV 文件如下所示 first name last name sri ram Rahul Dravid JetPay Underwriter Anil Kumar Gur
  • 如何在非托管c++ dll中查找调用者程序集名称

    我有一个非托管 c dll 我正在从 c net 3 5 调用此非托管 dll 的外部方法 我正在寻找一种方法来找到女巫 c 程序集正在调用我的非托管 c dll 进入我的 c dll 至少是程序集的名称 当然 我不想将任何附加参数传递给方
  • 显示虚拟环境

    当我在 virtualenv 中并且它处于活动状态时 环境名称将显示在正常命令行提示符之前的括号中 看起来像 foo env User Development foo env foo where foo env是环境的名称 我想知道是否有办
  • T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列

    我想知道这是否可能 如果条件为真 我想更新列 x 否则将更新列 y UPDATE table SET CASE CONDITION WHEN TRUE THEN columnx ELSE columny END 25 我到处搜索 尝试了一些
  • 在 .Net 中使用 GraphQL 客户端库实施 AWS Appsync

    我正在尝试实现类似于此 python 示例但在 net 中的应用程序同步订阅https aws amazon com blogs mobile appsync websockets python https aws amazon com b
  • 在 asp.net mvc 中实现“不跟踪”

    如何实现不跟踪来自 asp net mvc3 的浏览器同意 如果用户设置了不跟踪浏览器中启用的设置 所有主要浏览器 例如 IE Firefox 和 Chrome 是否都会发送一些 cookie 同意请求 Do Not Track 仅意味着浏
  • 如何设置根视图控制器

    我设置了一个仅包含应用程序委托类的空应用程序 然后对视图控制器类进行子类化以创建 xib 来布局应用程序并建立连接 但是当我尝试在 iOS 模拟器上运行该应用程序时 出现错误 CoinToss 6212 f803 应用程序预计在应用程序启动
  • std::set of MyElement 与 MyElement::SomeMethod 作为自定义比较器

    我有一个简单的MyElement类 我想使用bool MyElement SomeMethod 作为自定义比较器std set of MyElement items 我已经进行了研究 并且已经知道一些替代解决方案 我在下面列出了这些解决方案
  • 如何检查 DataView.RowFilter 中的空白

    假设我有一个名为 A 的列 并且我想检查 A 是否为空或空白 那么使用 DataView 的 RowFilter 进行检查的正确方法是什么 DataTable dt GetData DataView dv new DataView dt d
  • 前向声明/何时最好包含标头? [复制]

    这个问题在这里已经有答案了 我很清楚何时可以 不能使用前向声明 但我仍然不确定一件事 假设我知道我迟早必须包含一个标头才能取消引用 A 类的对象 我不清楚做类似的事情是否更有效 class A class B A a void DoSome