Статические переменные в перегруженных функциях - PullRequest
1 голос
/ 14 июня 2010

У меня есть функция, которая выполняет следующие действия:

  • Когда функция вызывается и передается истинное значение bool, она устанавливает статическое значение bool равным true
  • Когда функциявызывается и передается строка, если статическое значение bool установлено в true, она будет что-то делать с этой строкой

Вот мое беспокойство - статическая переменная останется неизменной между двумя перегруженными функциями?Если нет, я могу просто создать отдельную функцию, предназначенную для отслеживания значения bool, но я стараюсь упростить задачу.

Ответы [ 3 ]

6 голосов
/ 14 июня 2010

Две перегруженные функции - это две разные функции.Даже если каждая функция содержит static bool с одним и тем же идентификатором, они принадлежат к разным областям действия, и идентификатор относится к отдельной переменной в каждой функции.

Если вам нужно разделить состояние между двумя функциями, вы, вероятно, лучшеотключение создания класса для инкапсуляции этого состояния и создание функций-членов этого класса.

3 голосов
/ 14 июня 2010

Нет, он создает две отдельные статические переменные - по одной для каждой функции. Имя любой функции 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;   
}
0 голосов
/ 14 июня 2010

Ответ - нет.Нет причин для этого, так как в конце концов мы говорим о 2 функциях.

Поскольку это уже продемонстрировано, я хотел бы затронуть самую суть вопроса: static.

static вводит глобальное состояние, а глобальное состояние является злом.Это приводит к незначительным ошибкам, трудностям в правильном тестировании (поскольку тест затрагивает те, которые выполняются после него), и даже не думает о том, чтобы стать там многопоточным ...

Поэтому я бы очень рекомендовал вам избегать static целиком.Тогда у вас будет 2 решения:

  • Создайте класс с двумя перегрузками в качестве методов и сохраните состояние (не статичное, пожалуйста)
  • Передайте bool в качестве параметра методам,Выходной параметр для перегрузки bool и входной параметр для перегрузки строки

Подберите то, что легче достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...