2010-09-08 2 views
2

Я объявил класс X в Xh следующим образом:C++ включение имен в .cc файлов

namespace Foo { 
class X{ 
.... 
}; 

} 

В X.cc Я хотел бы определить конструктор, методы X.

Do I необходимо заключить все мои определения внутри namespace Foo {...} или префикс X как Foo :: X :: для каждого метода?

кажется, что иногда я могу только сказать (с использованием пространства имен Foo) и не упоминать об этом снова, т.е. просто определить методы, как X :: X() {...}

Что такое правильный подход Вот ?

ответ

4

Любой из трех подходов, которые вы предлагаете, будет работать. Дано:

namespace N { 
    struct S { 
     int F(); 
    }; 
} 

Вы можете поместить определение в блоке имен:

namespace N { 
    int S::f() { return 42; } 
} 

Вы можете квалифицироваться имя элемента с именем пространства имен:

int N::S::f() { return 42; } 

Или вы можете использовать с помощью (я бы не рекомендовал этого, хотя):

using namespace N; 
int S::f() { return 42; } 

Как правило, я бы рекомендовал не использовать директиву using. Что касается двух других (использование блока пространства имен или определение имен), я не думаю, что это действительно имеет значение. Я делаю оба в своем коде.

+0

'+ 1' для подготовки рекомендаций в отношении использования директив. Они ведут к темной стороне языка. – sbi

+0

@sbi: Я понимаю, что мы не хотим «использовать пространство имен N» в файле .h. Почему это плохо в файле .cc? – user231536

+0

@ user231536: Это затрудняет понимание исходного кода, потому что вы не знаете, откуда пришли имена. Он вносит _all_ имен в охватываемое пространство имен, что может вызвать широкий спектр болезненных проблем, одним из самых больших из которых является то, что вы можете непреднамеренно привести к дополнительным перегрузкам функций во время разрешения перегрузки, что может привести к тому, что неправильная функция будет (или сумасшедшие ошибки времени компиляции). –

0

Нет, вам не нужно использовать namespace Foo {...} при определении вашего класса. Все ваши подходы справедливы, но лично я предпочел бы следующее:

// In FOO.h 
namespace FOO 
{ 
class A 
{ 
public: 
    A(); 
}; 
} 

И реализация:

// In FOO.cpp 
#include "Foo.h" 
FOO::A::A() 
{ 
cout<<endl; 
}