Статические переменные в перегруженных функциях
-
27-09-2019 - |
Вопрос
У меня есть функция, которая делает следующее:
- Когда функция вызывается и ей передается значение true bool, она устанавливает статическое значение bool в значение true.
- Когда функция вызывается и передает строку, если для статического значения bool установлено значение true, она что-то сделает с этой строкой.
Вот что меня беспокоит: останется ли статическая переменная одинаковой между двумя перегруженными функциями?Если нет, я могу просто создать отдельную функцию, предназначенную для отслеживания значения bool, но я стараюсь не усложнять задачу.
Решение
Нет, он создает две отдельные статические переменные — по одной для каждой функции.Имя любой функции C++ состоит из ее видимого имени и типов ее параметров, и к этому прикрепляется имя статики (по крайней мере, концептуально).Вместо того, чтобы добавлять еще одну функцию, вы можете рассмотреть возможность сделать переменную статической по отношению к классу, содержащему функции, хотя это не дает вам точно такого же поведения, или поместить ее в анонимное пространство имен:
namespace {
int myvar = 0;
}
int f( bool b ) {
return myvar;
}
int f( const string & s ) {
return myvar;
}
Чтобы сделать функции членами класса:
// a.h
class A {
public:
static int f( bool b ) {
return myvar;
}
static int f( const string & s ) {
return myvar;
}
private:
static int myvar;
};
// a.cpp
int A::myvar = 0;
// main.cpp
#include <iostream>
#include <a.h>
int main() {
std::cout << A::f(false) << A::f( string("foobar") ) << std::endl;
}
Другие советы
Два перегруженных функция являются двумя разными функциями. Даже если каждая функция содержит static bool
С таким же идентификатором они принадлежат в разных областях, и идентификатор относится к отчетливой переменной в каждой функции.
Если вам нужно делиться состоянием между двумя функциями, вам, вероятно, лучше внести класс для инкапсуляции этого состояния и сделать две функции функции членов этого класса.
Ответ - нет. Нет причин это должно быть, поскольку ведь мы говорим о 2 функциях.
Так как это уже было продемонстрировано, я хотел бы обратиться к самому основну: static
.
static
Вводит глобальное государство, а глобальное государство зло. Это приводит к тонким ошибкам, трудностям для правильной проверки (так как тест влияет на те, которые выполняются после нее) и даже не думают о том, что там многоподобные ...
Поэтому я бы действительно поощрил вас, чтобы избежать static
полностью. У вас будет 2 решения:
- Сделайте класс с двумя перегрузками как методы, а состояние хранения (не статично, пожалуйста)
- Передайте BOOL в качестве параметра к методам, выключатель для перегрузки BOOL и параметра для перегрузки строки
Забрать, какой бы легче добиться.