Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转发声明如何隐藏依赖项并导致用户代码跳过必要的重新编译?(谷歌风格指南c+;+;)_C++_Google Style Guide - Fatal编程技术网

C++ 转发声明如何隐藏依赖项并导致用户代码跳过必要的重新编译?(谷歌风格指南c+;+;)

C++ 转发声明如何隐藏依赖项并导致用户代码跳过必要的重新编译?(谷歌风格指南c+;+;),c++,google-style-guide,C++,Google Style Guide,转发声明可以隐藏依赖项,允许用户代码在标题更改时跳过必要的重新编译 从 我最近了解到,关于是使用前向声明还是只在头本身中包含头,存在一些争论。在工作中,我们向前声明我们的内部类(不是库代码),并在相应的.cpp中包含包含这些类的标题。如果.cpp中的代码从未使用该类,则可以完全跳过包含;它通过了打字 假设我们有以下代码和文件 #pragma once //test.h class Test{ public: void foo() const; }; MyClass根本不需要知道测试的

转发声明可以隐藏依赖项,允许用户代码在标题更改时跳过必要的重新编译

我最近了解到,关于是使用前向声明还是只在头本身中包含头,存在一些争论。在工作中,我们向前声明我们的内部类(不是库代码),并在相应的
.cpp
中包含包含这些类的标题。如果
.cpp
中的代码从未使用该类,则可以完全跳过包含;它通过了打字

假设我们有以下代码和文件

#pragma once
//test.h
class Test{ 
public:
    void foo() const;
};
MyClass根本不需要知道测试的大小就可以访问
doWork()
。因此,我们不需要包含
Test.h
。只有真正起作用的函数(
doWork
)才需要包含在其cpp中。通过使用转发声明,对
Test.h
的更改不会导致MyClass.cpp的任何重新编译。但在我看来,这是一件好事,因为这不是必要的重新编译

免责声明:《谷歌风格指南》中有一个与void*相关的示例,但我不确定它是否与此要点相关;因为这只是一个不正确的函数调用,而不是必要的重新编译。另外,我相信如果函数是在.cpp中定义的,并且它们包含了适当的类,那么这个特定的示例将被消除。此外,如果它与我在这个问题中的要点有关,那么缓解与void*相关的问题听起来不足以完全禁止使用远期声明

所以,我的问题是——有没有任何具体的例子表明它会跳过必要的重新编译

编辑:
这不是链接帖子的副本,因为该答案只包含一个void*回复。我在这个问题中说,我正在寻找任何其他的例子,从虚空*给出。IMO完全放弃使用前向声明是一个相当深奥的问题(希望在现代c++中不常见)。在我看来,创建一个规则来禁止使用引用,包括传递引用,因为类成员引用可以通过默认副本轻松生成悬空引用

这不是链接帖子的副本,因为该答案只包含一个void*响应。我在这个问题中说,我正在寻找任何其他的例子,从虚空*给出。IMO完全放弃使用前向声明是一个相当深奥的问题(希望在现代c++中不常见)。在我看来,创建一个规则来禁止使用引用,包括passby引用,因为类成员引用可以通过默认副本轻松生成悬空引用。
//test.cpp
#include<iostream>
#include "test.h"
void Test::foo() const
{
    std::cout << "test" << std::endl;
}
#pragma once
//worker_function.h
class Test;
void doWork(const Test&);
//worker_function.cpp
#include"worker_function.h"
#include"Test.h"
void doWork(const Test& obj){
   obj.foo(); //must include for compilation
}
#pragma once
//myclass.h
class Test;
class MyClass{
public:
    void passthrough(const Test& obj);
};
//myclass.cpp
#include "myClass.h"
#include "worker_function.h"

void MyClass::passthrough(const Test& obj){
   doWork(obj);
}