以C+格式转发声明+;-当它';什么事? 我认为这是一种C++的精神——你不为你所不做的付出代价。 想要(你明确地为你需要的东西付费):

以C+格式转发声明+;-当它';什么事? 我认为这是一种C++的精神——你不为你所不做的付出代价。 想要(你明确地为你需要的东西付费):,c++,forward-declaration,C++,Forward Declaration,我们应该称之为“接口的基本类型”模块吗 接口的类型应该类似于基本类型(总是 定义和可用)?这也有道理,但仍不清楚 哪种方法更好(例如,Qt混合了两种方法) 我的个人决定-始终提供两种方式以实现更好的模块化(当我们有足够的依赖性时): //a_decl.h #包括 模板 类QVector; 结构A { 空洞过程(QVector); 无效打印(标准::ostream&); }; //a.h //如果要使用大多数接口方法,请包含此文件 //也不想写太多的“包括”` #包括 #包括 #包括“a_decl

我们应该称之为“接口的基本类型”模块吗 接口的类型应该类似于基本类型(总是 定义和可用)?这也有道理,但仍不清楚 哪种方法更好(例如,Qt混合了两种方法)

我的个人决定-始终提供两种方式以实现更好的模块化(当我们有足够的依赖性时):

//a_decl.h
#包括
模板
类QVector;
结构A
{
空洞过程(QVector);
无效打印(标准::ostream&);
};
//a.h
//如果要使用大多数接口方法,请包含此文件
//也不想写太多的“包括”`
#包括
#包括
#包括“a_decl.h”
并让开发人员选择要包含的内容

关于这些方法,你能说些什么?什么方式对你更有利?为什么?我们是否有一个明确的所有案例的赢家,还是总是取决于上下文

从我与语言创建者的通信中(我没有收到最终答案)

更新:


boost 1.48.0附带了容器库,它允许定义未定义用户类型()的容器。

C++是一种给程序员留下许多自由度的语言,因此不可避免地会有不同的方法来做同样的事情

依我看,你所定义的“解决方案”,即在任何.h文件中包含所有必要的include或forward声明,是避免“不完整的头文件”的方法,我一直遵循这一规则

有一本有趣的书详细讨论了做或不做的所有利弊:,上面的规则来自哪里

具体谈到远期声明,Lakos区分了“名义上”和“规模上”的类用法;只有在第二种情况下(根据他的意见),使用远期声明才是合法的:

定义:如果编译f的主体需要首先看到T的定义,则函数f在大小上使用类型T

定义:只有在编译f和f可能依赖的任何组件不需要首先看到T的定义时,函数f才在名称上使用类型T

()

具体而言,拉科斯的推理是围绕着C++程序的某些风格对大规模系统的影响,即一定复杂度的系统,但我认为他的建议非常适合于任何规模系统。
希望他的帮助。

< P>我认为两者都是正确的方法。

创建前向标头很简单,而且很大程度上是库维护人员的责任

然后,开发人员/客户机可以根据自己的需要选择使用转发头或物理头

在可能的情况下,大型项目肯定会喜欢并受益于转发头

包含物理头并不能真正解决依赖性问题,但在许多情况下会引入新的依赖性。e、 g.“如果我从此标题中删除
#include
,则某些编译将失败(并且可能因您使用的库及其平台差异而有所不同)


<>我认为一个好的图书馆维护者应该提供前向的头,因为其他人在基于平台、版本等方面保持任何差异和更新是痛苦的。当项目变得适当的时候,有一个明确的赢家——两者都是,你总是有选择的。

我很困惑。为什么你在谈论模块?是的,C++中有N个。o这样的关键字,但模块化至少是所有面向对象语言的共同概念。“in size”术语很糟糕。您需要定义类型,以便通过指针调用其非虚拟成员,或访问其静态成员,但这与对象的大小无关。
// a.h
#include <iosfwd>

template< class T >
class QVector;

struct A
{
void process( QVector<int> );

void print( std::ostream& );
};

// some.cpp

#include "a.h"

#include <iostream> // I need only A::print() in this module, not full interface

...
A().print( std::cout );
...
#include <iostream>
#include <QVector>

struct A
{
void process( QVector<int> );

void print( std::ostream& );
};
// a_decl.h
#include <iosfwd>

template< class T >
class QVector;

struct A
{
void process( QVector<int> );

void print( std::ostream& );
};

// a.h
// Include this file if you want to use most interface methods
// and don't want to write a lot of `#include`
#include <iostream>
#include <QVector>

#include "a_decl.h"