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

  • 当调用该函数并传递 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 具有相同的标识符,它们属于不同的作用域,并且标识符引用每个函数中的不同变量。

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

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

既然已经被证明了,我想解决问题的核心: static.

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

因此我真的鼓励你避免 static 完全。然后你会有 2 个解决方案:

  • 创建一个类,将两个重载作为方法,并存储状态(请不是静态的)
  • 将 bool 作为参数传递给方法,将 bool 重载的外参数传递给方法,将字符串重载的内参数传递给方法

选择更容易实现的那个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top