Пространства имен и файлы заголовков - PullRequest
4 голосов
/ 20 апреля 2010

Я спрашиваю о наилучшей практике, широко используемой в проектах C ++. Мне нужно иметь свои собственные типы в проекте. Это коллекция из нескольких typedefs.

Включает заголовочный файл, содержащий полезную практику типов в 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 голосов
/ 20 апреля 2010

Два понятия ортогональны; сравнивать их так, как вы просите, не имеет смысла.

Если вы не используете эти типы только в одном файле, вы должны поместить их в заголовок, чтобы вы могли легко вносить их определения, когда они вам нужны. Затем в этом заголовке вы можете включить ваше пространство имен:

#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 голосов
/ 20 апреля 2010

С точки зрения зависимости, присвоение имен всем типам в одном заголовке, вероятно, будет кошмаром обслуживания. Это понятно для 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 голос
/ 20 апреля 2010

Эээ ... Я думаю, что в том числе файл заголовка в порядке. Я не уверен, как пространства имен атакуют эту же проблему вообще ...

Главное в любой «наилучшей практике», как это, - БЫТЬ СОВМЕСТНЫМ.

...