2010-04-20 6 views
4

Я спрашиваю о лучшей практике, широко используемой в проектах на 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: 
     // ... 
}; 

Как это будет выглядеть, как с пространствами имен?

ответ

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

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

Главное, с любой «лучшей практикой», подобной этой, БЫТЬ СОГЛАСНО.

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"

Смежные вопросы