我在询问C ++项目中广泛使用的最佳实践。我需要在项目中拥有自己的类型。它是几个typedef的集合。
包含头文件包含C ++中的类型良好实践,还是使用命名空间更好。如果是这样,为什么?这两种方式的优点和缺点是什么?
现在它看起来像这样:
types.h中:
#ifndef TYPES_H
#define TYPES_H
#include <list>
// forward declaration
class Class;
typedef int TInt;
// ...
typedef std::list<Class> class_list;
#endif
class.h:
#ifndef CLASS_H
#define CLASS_H
#include "types.h"
class Class
{
public:
// ...
TInt getMethod();
private:
// ...
};
命名空间的外观如何?
答案 0 :(得分:10)
这两个概念是正交的;比较它们你提出的方式毫无意义。
除非您只在单个文件中使用这些类型,否则必须将它们放在标题中,以便在需要时轻松引入它们的定义。然后,在该标题中,您可以包含命名空间:
#ifndef TYPES_H
#define TYPES_H
#include <list>
namespace MyNamespace {
// forward declaration
class Class;
typedef int TInt;
// ...
typedef std::list<Class> class_list;
}
#endif
之后你可以在MyNamespace::TInt
int
而不是#include "Types.h"
答案 1 :(得分:4)
从依赖关系的角度来看,在单个标头中命名所有类型可能是维护的噩梦。这对于typedef
是可以理解的,因为您需要一个唯一的定义,但没有理由在这里转发声明class
。
// types.h
namespace myproject
{
typedef int TInt;
} // namespace myproject
向前声明Class
符号没有意义:您污染了自己的命名空间。让每个文件独立决定是否需要符号,然后自行声明它。
宣称ClassList
也不是很好:它应该仅对需要它的人可用。您可以为Class
相关内容的前向声明创建特定标题:
// class_fwd.h
namespace myproject
{
class Class;
typedef std::list<Class> ClassList;
} // namespace myproject
// class.h
#include "myproject/class_fwd.h"
namespace myproject
{
class Class {};
} // namespace myproject
答案 2 :(得分:1)
嗯......我认为包含头文件很好。我不确定命名空间是如何攻击同一个问题的......
这样的任何“最佳实践”的主要内容是BE CONSISTENT。