2012-07-03 8 views
0

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

Так, например, если я хотел namespace A, который содержал namespace B и B были некоторые неприятными детали реализации функций в A, что я хотел скрытый от конечного пользователя, есть какое-то линкер обмана, что я могу использовать так что B не отображается за пределами A, но A все еще остается видимым для остальной части программы?

+0

Я думаю, что единственным «обманом», который здесь участвует, является «избегать« B 'в файле заголовка». –

+0

Не называйте пространство имен «B», назовите его «Internal_B» :-) –

+0

... не ставьте B в файл заголовка? Что именно это значит? Я должен положить его где-нибудь ... – anthropomorphic

ответ

1

Цель пространств имен - избегать конфликтов имен. Это по существу все. Они не предоставляют никаких функций, чтобы скрыть что-либо. Хотя в определенной степени они вынуждают писать namesp_name::sometinng. Это может заставить пользователя подумать, стоит ли это делать или нет.

Что предлагают вышеприведенные комментарии, в основном разбивает ваш заголовок на публичный заголовок и закрытый заголовок. Частный заголовок включен только в ваш файл cpp, и он не должен включаться в код верхнего уровня. Это работает во многих случаях, и это полезно, но оно не решает всех проблем.

+0

Что вы имеете в виду, когда говорите «но это не решает всех проблем»? Означает ли это, что если 'namespace B' определяется только в файлах cpp для моего пространства имен' A', 'B' все равно будет доступен из-за пределов этих двух мест? – anthropomorphic

+0

«Не решает все проблемы» относится к концепции публичных и закрытых файлов заголовков. Сама эта концепция не имеет ничего общего с пространствами имен. –

+0

Когда программа скомпилирована, все видимое происходит только из файлов заголовков, которые включены в текущую компиляцию. Нельзя получить доступ к информации из более ранних объектных файлов или из файлов заголовков, которые были включены в другие места. –

1

Что вы, кажется, говорите, это паттерн «Пимпл» и/или Идиома ручки/тела. Или несколько других имен, которые вы можете придумать. На самом деле краткий пример таков: на странице Smart Pointer. В нем объясняется, как вы можете объявить класс с неполным типом в интеллектуальный указатель, а затем определить реализацию где-то еще. Это «скрывает» его от пользователя API, поскольку реализация для «внутреннего» класса может изменяться без повторной компиляции кем-либо, кроме создателя библиотеки, потому что размер только в реализациях, а не в файлах заголовков. Известен только размер «общедоступного» класса и остается постоянным. Прочтите два файла .cpp и один .hpp-файл и посмотрите, имеет ли смысл, почему он работает.

Надеюсь, это связано с тем, что вы пытаетесь сделать.

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