命名空间 vs. 头文件

4

我想问一下在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:
        // ...
};

如果使用命名空间,它会是什么样子?

3个回答

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"


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

1

嗯...我认为包含头文件是可以的。我不确定命名空间如何解决这个问题...

任何“最佳实践”的主要问题在于要保持一致。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接