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