2008-11-18 3 views
2

Предполагая класс под названием Bar в пространстве имен foo, какой синтаксис вы предпочитаете для своего исходного файла (.cpp/.cc)?Предпочитаемый синтаксис пространства имен для исходных файлов

namespace foo { 
... 
void Bar::SomeMethod() 
{ 
    ... 
} 

} // foo 

или

void foo::Bar::SomeMethod() 
{ 
    ... 
} 

Я использую пространства имен в значительной степени и предпочитаю первый синтаксис, но при добавлении кода с помощью визуального мастер студии класса (WM_COMMAND обработчиков и т.д.), автоматически сгенерированного код использует второй , Существуют ли какие-либо преимущества одного синтаксиса над другим?

+0

Ack. Я прикрутил первый пример. Отредактировано соответственно. – Rob 2008-11-18 21:02:30

ответ

6

Я бы отказался от первого (): вопрос изменился, первый - это то, что я предпочитаю сейчас). Поскольку неясно, на что ссылается Bar, только глядя на определение функции. Кроме того, с первого метода, Slippy ошибки могут показать:

namespace bar { 
    struct foo { void f(); }; 
} 

namespace baz { 
    struct foo { void f(); }; 
} 

using namespace bar; 
using namespace baz; 

void foo::f() { // which foo?? 

} 

Потому что это выглядит в текущей области (там глобальный масштаб), он находит два Foo, и говорит вам ссылку на него является неоднозначным.

Лично я хотел бы сделать это следующим образом:

namespace foo { 
void Bar::SomeMethod() { 
    // something in here 
} 
} 

Это также не ясно, только глядя на определение SomeMethod к какому пространству имен она принадлежит, но у вас есть пространство имен сферы вокруг него, и вы можете легко найти это вверх. Кроме того, теперь ясно, что Bar ссылается на пространство имен foo.

Второй способ, который вы показываете, будет слишком много для меня. Кроме того, второй способ может вызвать путаницу среди новых читателей вашего кода: Является ли foo классом, а Bar - его вложенным классом? Или foo пространство имен и класс Bar?

1

Я думаю, это зависит от каждого случая. Если это сторонняя библиотека, похожая на ваш собственный код, и вы хотите избежать путаницы в коде, то определение полного пространства имен при каждом возникновении может быть полезным. Но кроме этого, меньше кода, как правило, лучше (если не становится неясным).

5

Я предпочитаю вариант не перечисленный:

namespace foo { 

void Bar::SomeMethod() 
{ 
    ... 
} 

} // foo namespace 

В отличие от варианта один, это делает очевидным, что ваш код принадлежит в пространстве имен Foo, а не просто использует его. В отличие от второго варианта, это экономит массу ввода. Беспроигрышная.

+0

Вот что я имел в виду для варианта 1. – Rob 2008-11-18 21:03:53

2

Я предпочел бы пойти на первый случай, когда пространство имена явно отмечены:

namespace TheNamespace { 
void TheClass::TheMethod() { 
    // code 
} 
} 

Причина заключается в том, что это видно из того, что синтаксиса TheClass является классом и TheNamespace этого пространства имен (не так очевидно другими именами). Если код был

void TheNamespace::TheClass::TheMethod() { 
    // code 
} 

то читатель не ясно видеть TheNamespace является ли пространство имен или класс с внутренним классом по имени TheClass.

class TheClass1 
{ 
    class TheClass2 
    { 
     void TheMethod(); 
    } 
}; 

void TheClass1::TheClass2::TheMethod() { 
    // code 
} 

Я, как правило, чтобы избежать «используя» заявление, и даже тогда, например, путем LITB с двумя классами в двух разных пространствах имен сделает как компилятор и программист спутать и его следует избегать.

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