Доступ к переменной внутри namespace из другого модуля
Поясню на примере:
В модуле one есть глобальная переменная g типа G;
Из модуля two можно получить доступ к этой переменной путем записи "extern G g;"
(То есть в самом хедере модуля one нигде явно не сказано о переменной g).
Теперь представим, что модуль one объявлен в пространстве имен N, а two - нет.
Как получить доступ к переменной g из модуля two ?
У меня, например, никаким другим способом, кроме явного указания в хедере модуля one (т.е. внутри пространства имен N) записи "extern G g;" (и включением этого хедера в two), не получилось. Есть ли варианты, или это единственно правильный ?
Добрый вечер, а если использовать функцию с параметром? Тогда отпадет необходимость плодить глобальные переменные. Кажисть так будет красивше да и функцию можно использовать из разных мест проги.
В любом случае существует некий верхний уровень, который можно считать глобальным :)
Если не устраивает тот факт, что это переменная будет видна любому модулю, который будет включать "one.h", можно, например сделать для пространства имен два интерфейса. Но смысл тогда в глобально переменной?
Зачем вообще делать глобальные переменные в С++? :confused:
Цитата: nikitozz
А чем вариант с включением в хедер не устраивает?
В принципе устраивает. Просто хотелось понять почему без пространства имен в хедер можно ничего не писать. А с пространством уже так не получается.
Сначала например пытался достучатся до переменной по аналогии с "беспространственным" вариантом, через :
Код:
extern N::G N::g;
Но линкер ругнулся.
Цитата: hardcase
Зачем вообще делать глобальные переменные в С++? :confused:
А скажем, как Вы реализуете разделение доступа к консоли из разных потоков, если не объявите глобальный мютекс ?
На границе C++ и C проходится хитрить... Вместо глобальной переменной можно использовать статическую переменную определенного класса. Но лучше синглтоны, наверное. Хотя их критикуют, но тут не вижу альтернативы.
Цитата: Absolut
как Вы реализуете разделение доступа к консоли из разных потоков, если не объявите глобальный мютекс ?
Цитата: Kogrom
Вместо глобальной переменной можно использовать статическую переменную определенного класса. Но лучше синглтоны, наверное.
Консоль - одна. Поэтому она отлично попадает под паттерн "синглтон", хотя с другой стороны, можно сделать и статические методы.
А вместо мьютекса можно и семафором обойтись.
Цитата: hardcase
А вместо мьютекса можно и семафором обойтись.
А почему именно "можно обойтись", в чем доминирующее преимущество семафора?