Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 名称空间上的变量总是有默认值吗?_C++_Namespaces_Default Value - Fatal编程技术网

C++ 名称空间上的变量总是有默认值吗?

C++ 名称空间上的变量总是有默认值吗?,c++,namespaces,default-value,C++,Namespaces,Default Value,下面是有问题的代码: #ifndef _ALTERFPS_H #define _ALTERFPS_H #include "HUDLuaFunctions.h" #include "AlterFPSNodes.h" namespace AlterFPS { namespace Globals { static bool teamAwareness; static int teams[] = {0, 0}; static bool

下面是有问题的代码:

#ifndef _ALTERFPS_H
#define _ALTERFPS_H

#include "HUDLuaFunctions.h"
#include "AlterFPSNodes.h"

namespace AlterFPS
{
    namespace Globals
    {
        static bool teamAwareness;
        static int teams[] = {0, 0};

        static bool getAwareness() {
            return teamAwareness;    
        }

        static void setAwareness(bool aware) {
            teamAwareness = aware;
        }
    }
}

#endif
问题是团队意识总是错误的


我将getter和setter(我将它们放在那里用于调试目的,我知道这不是Java)断点,并发现setter确实将变量设置为true,但随后对getAwareness的调用显示teamAwareness为false(其间没有setAwareness调用)。。。这怎么可能呢?如何修复它?

具有静态生存期的变量总是初始化为零。这些措施包括:

  • 名称空间变量(包括全局名称空间),无论是静态的还是非静态的
  • 局部静态变量
  • 成员静态变量
零初始化使其变得简单,意味着:

  • 如果是数字类型:0
  • 如果是布尔:错
  • 如果是指针:NULL
  • 如果是枚举:0,则强制转换为枚举类型
  • 如果是类类型:默认构造
但您的问题与此无关,这是因为您的变量被声明为
static
,并且它位于头文件中,因此包含它的每个编译单元(.cpp文件)实际上都会看到它自己的变量实例。如果您从一个.cpp文件更改它,您将看不到另一个.cpp文件的更改

您要做的是在.h文件中声明变量
extern
,然后在任何.cpp文件中正常定义它(不带修饰符):

//.h file
namespace Globals
{
    extern bool teamAwareness; 

    inline void setAwareness(bool aware) {
        teamAwareness = aware;
    }
}

//.cpp file
namespace Globals
{
    bool teamAwareness; 
}

顺便说一句,函数最好声明为
inline

静态生存期的变量总是初始化为零。这些措施包括:

  • 名称空间变量(包括全局名称空间),无论是静态的还是非静态的
  • 局部静态变量
  • 成员静态变量
零初始化使其变得简单,意味着:

  • 如果是数字类型:0
  • 如果是布尔:错
  • 如果是指针:NULL
  • 如果是枚举:0,则强制转换为枚举类型
  • 如果是类类型:默认构造
但您的问题与此无关,这是因为您的变量被声明为
static
,并且它位于头文件中,因此包含它的每个编译单元(.cpp文件)实际上都会看到它自己的变量实例。如果您从一个.cpp文件更改它,您将看不到另一个.cpp文件的更改

您要做的是在.h文件中声明变量
extern
,然后在任何.cpp文件中正常定义它(不带修饰符):

//.h file
namespace Globals
{
    extern bool teamAwareness; 

    inline void setAwareness(bool aware) {
        teamAwareness = aware;
    }
}

//.cpp file
namespace Globals
{
    bool teamAwareness; 
}

顺便说一句,该函数最好声明为
inline

我无法重现您的错误。我从getter获得
true
false
,这取决于我给setter的是什么。我在一个不太了解的引擎中使用这个代码?有没有办法知道引擎不知怎么搞砸了我的代码?换句话说,当变量发生变化时,我如何设置断点?对TeamAware的唯一引用是get和set,这正是我想要的。这个头文件包括多少个位置?每个地方都有一个名为
teamAwareness
的变量的副本,因为您将其声明为
static
@Drknezz:在头文件中将
static
更改为
extern
,然后在.cpp文件中定义变量:
名称空间AlterFPS{namespace Global{bool teamAwareness;int teams[]={0,0};}}
我无法重现您的错误。我从getter获得
true
false
,这取决于我给setter的是什么。我在一个不太了解的引擎中使用这个代码?有没有办法知道引擎不知怎么搞砸了我的代码?换句话说,当变量发生变化时,我如何设置断点?对TeamAware的唯一引用是get和set,这正是我想要的。这个头文件包括多少个位置?每个地方都有一个名为
teamAwareness
的变量的副本,因为您将其声明为
static
@Drknezz:在头文件中将
static
更改为
extern
,然后在.cpp文件中定义变量:
名称空间AlterFPS{namespace Global{bool teamAwareness;int teams[]={0,0};}}