Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ограничить область видимости хидера. как?


Автор: boostcoder 13.6.2011, 17:55
всем снова доброго дня.
вопрос следующий: при подключении хидера в хидер, каким образом можно сделать так, что чтоб содержимое первого было доступно только хидеру подключившему его, но не более?

спасибо.

Автор: kemiisto 13.6.2011, 17:58
Очень просто. Использовать нормальный модульный язык, а не язык-калеку. smile 

Автор: YDean 13.6.2011, 18:25
запихнуть include в namespace

Автор: mes 13.6.2011, 18:26
в том виде в каком задан вопрос - никак.

Добавлено через 1 минуту и 20 секунд
Цитата(YDean @  13.6.2011,  17:25 Найти цитируемый пост)
запихнуть include в namespace 

и это ограничит доступность во всех местах кроме текущего хидера?

Добавлено через 2 минуты и 36 секунд
и за что kemiisto все время минусят ? ведь иногда он прав и говорит довольно правильные вещи.. 

Автор: YDean 13.6.2011, 18:33
Цитата(mes @  13.6.2011,  18:26 Найти цитируемый пост)
и это ограничит доступность во всех местах кроме текущего хидера?

Смотря, что нужно: явная невидимость или полная недоступность.
(в заголовке темы: видимость, а в тексте: доступность)

Автор: mes 13.6.2011, 18:42
Цитата(YDean @  13.6.2011,  17:33 Найти цитируемый пост)
смотря, что нужно: явная невидимость или полная недоступность.

покажите "ограничение на хидер" для любого из случаев smile

Автор: boostcoder 13.6.2011, 18:44
значит никак.
всем спасибо.

Автор: mes 13.6.2011, 18:54
Цитата(boostcoder @  13.6.2011,  17:44 Найти цитируемый пост)
значит никак.

если уточните, что именно надо может быть и найдется решение.. 

Автор: boostcoder 13.6.2011, 18:57
mes, вот смотрите...
есть первый хидер:
Код

// 1.hpp

struct my_type {};



и есть второй, который использует первый:
Код

// 2.hpp

struct base {

   my_type type;
};



вопрос в том, что нужно сделать, чтоб my_type был доступен только в "2.hpp". но нигде более, даже если "2.hpp" инклудидтся куда-то еще.

Автор: YDean 13.6.2011, 19:02


тогда и struct base не будет видна в остальных местах?

Автор: mes 13.6.2011, 19:10
решение очевидное : не включать 1.hpp в 2.hpp.. 
как именно этого добиться зависит от того, что есть my_type .. 
Вам нужно для pimpl или что то другое преследуете ?


Автор: YDean 13.6.2011, 19:35
если бы в struct base был указатель на my_type, можно было бы задекларировать только имя, а полную декларацию my_type и всех, кто с ней работает, вынести (или подключить) в CPP.

Код

// 2.hpp
struct my_type;

struct base {
   my_type *type;
};

Автор: boostcoder 14.6.2011, 18:52
Цитата(mes @  13.6.2011,  19:10 Найти цитируемый пост)
решение очевидное : не включать 1.hpp в 2.hpp.. 

это невозможно, ибо 2.hpp использует то, что находится в 1.hpp

Цитата(mes @  13.6.2011,  19:10 Найти цитируемый пост)
Вам нужно для pimpl или что то другое преследуете ?

да нет. просто любопытство.

Автор: mes 14.6.2011, 22:07
Цитата(boostcoder @  14.6.2011,  17:52 Найти цитируемый пост)
это невозможно, ибо 2.hpp использует то, что находится в 1.hpp

_использовать_ может по разному.. без описания задачи трудно оценить реальную возможность расцепления.. 
но если так тянет "скрыть от всех 1.hpp", то наверное все таки лазейка есть..

Добавлено через 2 минуты и 7 секунд
тут вот у шаблонов проблема с расцеплением из за отсутствия нормального экспорта.. 
но и то при правильной архитектуре не сильно загромаждают жизненное пространство.. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)