2015-01-25 2 views
0

Я хочу знать фактическую причину написания имен классов внутри пространства имен. Какую цель они решают? Включают ли они классы или делают что-то еще? Любая помощь приветствуется.Почему использовать классы в пространстве имен

namespace ns3 { 
class Channel; 
class SpectrumChannel; 
class MyMod;      ; 

class NewModule : public NetDevice 
{ 
public: 
// methods and data 
} 
+0

поиск 'forward declaration' – billz

+0

Спасибо, так это способ сказать компилятору, что я буду использовать эти классы в будущем, так что держите их подготовленными? Я озадачен, потому что включенные файлы для вышеописанного не включают файлы, в которых определены классы (Channel, SpectrumChannel, MyMod). – user2532296

+1

Он сообщает компилятору «Я расскажу вам подробнее о том, что они содержат позже, но мне нужно, чтобы вы знали, что они существуют сейчас». В типичном случае это означает, что где-то есть класс, который принимает ссылку или указатель на один из этих классов, но это неправильное место для того, чтобы actullay определял контент - или существует взаимная связь между кланами, поэтому класс X необходим классу Y, а класс Y относится к X каким-то образом. –

ответ

1

Это хорошая практика, чтобы поместить ваши классы в пространстве имен, чтобы избежать столкновения имя с другим кодом (библиотек), вы можете использовать (также приходит позже в проекте). При использовании общих имен, таких как Vector, Logger и т. Д. В качестве имен классов, может случиться так, что они также используются в другом коде, который вы хотите использовать. Когда вы помещаете свои классы в (хорошо продуманное) пространство имен, этот шанс столкновения имен минимизируется.

Передовые декларации - это другая (независимая) тема. Когда классы определены в пространстве имен, их передовые декларации должны выполняться внутри этого пространства имен.

+0

Спасибо за объяснение, у меня все еще есть следующий вопрос: \t Можно ли сказать компилятору, что я буду использовать эти классы в будущем, так что держите их подготовленными? Я озадачен, потому что указанный выше файл не содержит файлы, в которых определены классы (Channel, SpectrumChannel, MyMod). – user2532296

+0

Для разбора компилятора C/C++ необходимо знать, какие идентификаторы относятся к типам. Если внутри файла используется только указатель или ссылка на тип, компилятору не нужно знать детали типа (размер, методы и т. Д.) Для компиляции этого единственного файла, поэтому достаточно объявления вперед. Вам нужны форвардные декларации, если у вас есть циклические зависимости типов в вашем коде. Еще одна причина для использования форвардных деклараций - более быстрая компиляция (определение класса прямого объявленного типа не нужно анализировать, а когда класс меняется, вам не нужно перекомпилировать код только с помощью forward decl) – coproc

+0

Спасибо, это очень полезно. – user2532296

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