В Java я нахожу очень простым использование пространств имен. Для каждого квалифицированного идентификатора Ident
Я использую в исходном файле, я ставлю import ns1.ns2.ns2.ns3.ns4.Ident;
в верхней части файла. Тогда я могу использовать (короткие) неквалифицированные имена везде в моем исходном коде. import
Оператор не может вызвать каких-либо проблем, потому что он применяется только к файлу, в котором он записан.
Тем не менее, я не совсем уверен, как избавиться от классификаторов пространства имен в C ++ лучшим способом.
Наиболее очевидным решением, вероятно, будет using
а также using namespace
заявление. Однако, это кажется довольно плохим решением, по крайней мере, в случае заголовочных файлов, потому что операторы using не ограничиваются одним файлом, в который они записаны. Так using
исключается в случае, например, тонкие библиотеки, состоящие только из заголовочных файлов с реализациями непосредственно внутри или в случае заголовочных файлов в целом.
Другой вариант, который я использую до сих пор, заключается в добавлении для каждого квалифицированного имени, которое я использую в классе, соответствующего typedef
в приватной секции класса. Поэтому, сравнивая этот подход с Java, я в основном беру весь список операторов импорта, заменяя import
с typedef
и поместите его в объявление класса.
Однако мне не очень нравится этот подход, потому что пользователи моих классов, строго говоря, не знают типы возвращаемых значений и значений параметров, потому что типы в объявлениях методов являются частными типами соответствующих классов.
Хорошо, теперь мы можем сделать все это typedef
вещи публичные. Но это, вероятно, не очень хорошая идея, так как мы будем переопределять каждый тип много раз. Просто подумай о структуре ns1::ns2::ns3::MyStructure
и два класса MyClassA
а также MyClassB
, Оба класса имеют метод, который на самом деле должен принимать в качестве параметра экземпляр ns1::ns2::ns3::MyStructure
, Но поскольку каждый класс переопределяет типы, которые он использует, чтобы избавиться от длинных квалифицированных имен, эти два метода теперь принимают параметры «разных» типов, скажем, MyClassA::MyStructure
а также MyClassB::MyStructure
, Это становится еще более броским, когда у нас есть третий класс MyClassC
который работает с экземпляром MyStructure
и нужно вызвать оба метода с ним. Должен ли этот класс объявить этот экземпляр с типом MyClassA::MyStructure
, MyClassB::MyStructure
или же MyClassC::MyStructure
?
Ну, я просто хочу знать: что является лучшим способом избавиться от классификаторов пространства имен?
Задача ещё не решена.
Других решений пока нет …