【问题标题】:Static Variables in Overloaded Functions重载函数中的静态变量
【发布时间】:2011-03-03 09:51:16
【问题描述】:

我有一个执行以下操作的函数:

  • 当函数被调用并传递一个 true bool 值时,它会将静态 bool 值设置为 true
  • 当调用函数并传递一个字符串时,如果静态 bool 值设置为 true,它将对该字符串执行一些操作

这是我关心的问题——两个重载函数之间的静态变量是否保持不变?如果没有,我可以简单地创建一个单独的函数来跟踪布尔值,但我尽量保持简单。

【问题讨论】:

    标签: c++ static function static-variables overloading


    【解决方案1】:

    两个重载函数是两个不同的函数。即使每个函数都包含一个具有相同标识符的static bool,它们属于不同的作用域,并且标识符指的是每个函数中不同的变量。

    如果您需要在两个函数之间共享状态,您最好创建一个类来封装此状态,并使两个函数成为该类的成员函数。

    【讨论】:

    • 我最初是从创建一个类开始的。但是,这需要我在整个程序中不断为每个函数创建该类的新对象。由于我需要能够无缝地使用这些函数,因此如果不在每个函数中创建一个新对象或在函数之间传递对象(两者都非常乏味),我无论如何都无法解决这个问题。
    • @BSchlinker:函数可以是静态的。在这种情况下,您不需要创建任何对象。
    • @Gorpik 什么是静态函数?我看不出这对这次扫描有什么帮助。
    • 您需要将此对象放在适合其使用的范围内。如果函数需要使用该对象,那么它们需要传递正确的实例。如果它确实是一个全局对象,那么您可以将其设为命名空间范围变量并让所有内容都直接访问它。
    • @Gorpik:如果你的意思是函数可以是类静态的,那么不,这不是我的意思。如果它们是静态的,它们将无法访问类对象封装的状态,因此这不是解决方案。
    【解决方案2】:

    不,它会创建两个单独的静态变量 - 每个函数一个。任何 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;   
    }
    

    【讨论】:

    • 很遗憾,由于这个函数一直在使用,所以没有被封装在一个类中。
    • @BSchlinker 无论是否持续使用都不应妨碍您使用课程。但正如我的回答所暗示的,还有其他选择。
    • 是否可以将类中的函数放入命名空间,这样它们基本上可以从任何地方访问?
    • @BSchlinker 不需要使用命名空间来执行此操作 - 我添加了一些代码来说明。
    【解决方案3】:

    答案是否定的。没有理由这样做,因为毕竟我们在谈论 2 个函数。

    既然已经演示过了,我想谈谈这个问题的核心:static

    static 引入全局状态,全局状态是邪恶的。它会导致细微的错误、难以正确测试(因为测试会影响之后执行的测试),甚至不会考虑在那里使用多线程......

    因此,我真的鼓励您完全避免使用static。然后,您将有 2 个解决方案:

    • 使用两个重载作为方法创建一个类,并存储状态(请不要静态)
    • 将布尔值作为参数传递给方法,布尔重载为输出参数,字符串重载为输入参数

    选择更容易实现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 2017-09-02
      • 2016-08-30
      • 2012-06-28
      • 2014-10-10
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多