2016-02-17 9 views
1

У меня есть ряд Templatic и инлайн функции, определенные в заголовка файла (назовем его head.h). В настоящее время эти функции используют некоторые глобальные переменные, объявленные с extern в том же заголовке и определенные где-то в одном .cpp.C++ переменная сфера заголовка

Все работает нормально, но я бы ограничил область глобальных переменных только заголовком, где они определены.

Другими словами каждый .h или .cpp, который включает в свой head.h не сможет увидеть такие глобалам.

Любой способ достичь этого результата?

+0

Почему вы хотите сделать это?Если несколько включений должны использовать функции, которые, в свою очередь, нуждаются в доступе к одной и той же глобальной переменной, как вы хотите, чтобы инсайдеры не видели и не использовали глобальную переменную? –

+0

@WernerHenze, потому что я не хочу переменное загрязнение. эти переменные должны использоваться только в этом заголовке. если функции не были встроенными, я бы определил свои глобальные переменные в cpp как статические, ограничив их область действия до этого cpp – willy

+0

или анонимного пространства имен, как кто-то предложил ниже – willy

ответ

1

Один из способов - разместить класс вокруг него вместо пространства имен, делая все функции общедоступными статическими методами этого класса и глобальными переменными частными статическими переменными.

т.е.

head.h:

class A 
{ 
    public: 
    template <typename T> static void MethodA(T const &value) 
    { 
     //... 
    } 
    inline static void MethodB(int a, int b) 
    { 
     // ... 
    } 

    private: 
    static int x; 
    static std::string y; 
}; 

head.cpp:

int A::x = 0; 
std::string A::y; 

EDIT:

Другой альтернативный метод был бы определить, как глобалам частные статические переменные в классе и сделать все f УНКЦИИ, которые разрешено использовать их друг функцию:

head.h:

template <typename T> void FunctionA(T const &value); 
void FunctionB(int a, int b); 

class Vars 
{ 
    friend template <typename T> void FunctionA(T const &value); 
    friend FunctionB(int a, int b); 

    private: 
    static int x; 
    static std::string y; 
}; 

template <typename T> void FunctionA(T const &value) 
{ 
    // ... 
    // ... A::x ... 
    // ... 
} 
inline void FunctionB(int a, int b) 
{ 
    // ... 
    // ... A::y ... 
    // ... 
} 

head.cpp:

int A::x = 0; 
std::string A::y; 
+0

это честное решение – willy

+0

yep, даже если более простой и, возможно, самый правильный ответ был «нет», я просил разрешения, и я думаю, что вы попали в точку – willy

0

Нет, это невозможно. Если вы объявите некоторую переменную как extern в header1.h - эта переменная будет доступна в любых других заголовках, которые включают header1.h.

2

включая заголовочные файлы, просто копирует содержимое файла заголовка в содержащийся файл cpp/h. Это означает, что вы не можете отличить, что вы делаете что-то в своем заголовочном файле или в файле cpp/h, который содержит ваш файл заголовка.

Таким образом, переменные, определенные в файле заголовка, не могут быть исключены. Если они находятся в файле CPP, и вы хотели бы запретить ехЬегп, вы можете использовать анонимную пространство имен:

namespace 
{ 
    int variable; 
} 

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

+0

Сначала создается одна переменная для каждого из них, включая cpp, а не одну глобальную переменную для всех. Во-вторых, это не предотвращает загрязнение глобального пространства имен, которое, похоже, требует того, чего хочет этот вопросник. –

+0

Пожалуйста, внимательно прочитайте мое сообщение. «Если они находятся в файле cpp ...», ясно сказано в предложении перед фрагментом кода. Ничего не включено в этот сценарий. – IceFire

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

  • Нет связанных вопросов^_^