2015-05-23 2 views
0

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

Рассмотрим этот заголовок:

// deck.h 
#pragma once 
#include <vector> 
#include "card.h" 

using namespace std; 

typedef vector<card> pile; 

class deck{ 
public: 
    deck(); 
    ~deck(); 
    void shuffle(); 
    card takeCard(); 
    int getSize(); 
private: 
    pile cDeck; 
}; 

Код в card.h является определение структуры карты. Должен ли typedef даже находиться в файле заголовка? И ifso, как мне избежать использования std :: vector?

Любые подсказки будут назначены.

+0

'using namespace std;' в файле заголовка - довольно плохая идея! –

+0

Вы не должны избегать '#include ' или 'std :: vector', вам нужно избегать' using namespace std; '. (Кроме того, если тип 'pile' является внутренним для класса, что кажется хорошей идеей, typedef должен находиться в закрытом разделе класса.) – molbdnilo

+0

' using std :: vector' является * супер * лучшим вариантом Вот! – iBug

ответ

1

Вы не ставите его вообще. Используйте std::vector вместо vector, наберите только 5 дополнительных символов. typedef в порядке, чтобы быть в файлах заголовков.

Как вы, вероятно, знаете, using namespace std; в заголовке BAD. Зачем? Поскольку все файлы, которые будут включать ваш заголовок, будут автоматически use namespace std;, и относительно легко попасть в конфликтующие имена, особенно в крупных проектах, где клиент может не знать о директиве using, которую он/она неявно использует.

В качестве альтернативы, вы можете use namespace std;внутри определение встроенной функции в заголовке,

inline void f() 
{ 
    using namespace std; 
    cout << "bla" << endl; 
} 

или классы,

class Foo 
{ 
using namespace std; 
    // rest 
}; 

Таким образом, using эффективно "видеть" только в его охватывающий объем.

Похожие: What's the scope of the "using" declaration in C++?

+0

5 символов верны для этого заголовка, но я могу себе представить, что есть гораздо большие заголовки, в которых на самом деле может быть довольно хлопотно набирать его каждый раз. Поэтому, даже если заголовочный файл будет более крупным, который будет использовать определенное пространство имен, вы все равно будете использовать xxx :: xx? Кажется, неправильно вводить его несколько раз. –

+0

@Dirklaren Я просто редактировал на самом деле. Вы можете «использовать пространство имен std;» в области, поэтому оно не будет «течь» вне его. – vsoftco

+2

@Dirklaren: Некоторые из нас используют 'std ::' * every * time. Это действительно нормальная вещь. Единственный раз, когда я использую директиву пространства имен, - это длинные вложенные пространства имен, например 'boost :: gregorian'. Даже тогда я не полностью удаляю его, я просто придумал аббревиатуру для него (например, 'namespace dt = boost :: gregorian;') и * only * в области функции. –

0

Удаление с помощью директивы тривиально, просто переписать код

// deck.h 
#pragma once 
#include <vector> 
#include "card.h" 

typedef std::vector<card> pile; 

class deck{ 
public: 
    deck(); 
    ~deck(); 
    void shuffle(); 
    card takeCard(); 
    int getSize(); 
private: 
    pile cDeck; 
}; 
0

Использование и использования пространства имен можно использовать в функциях в вашей реализации. Если вы хотите ограничить возможные конфликты, как упоминалось выше, и вы находитесь в ситуации, когда вам действительно нужно использовать «использование» или «использование пространства имен», храните его в небольших функциях.

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