【问题标题】:namespace global variable losing value (C++)命名空间全局变量丢失值 (C++)
【发布时间】:2013-10-02 11:40:39
【问题描述】:

所以在我命名空间的 .h 文件中,我有

namespace wtvr{
    static Matrix m;
    void LoadIdentity(void);
};

在它的 .cpp 文件中,我有

namespace wtvr{
    void LoadIdentity(void){
        m = Identity();
        m.display();// trace for debugging
    }
};

主程序中的其他位置

wtvr::LoadIdentity();
wtvr::m.display();

第一个 display() 从 LoadIdentity() 函数中将单位矩阵打印到屏幕上,但第二个(在函数返回后)显示全零。 为什么我的价值观会消失? 我应该以不同的方式使我的全球化吗? 谢谢

【问题讨论】:

    标签: c++ variables static namespaces global


    【解决方案1】:

    您已经在头文件中声明了static Matrix m;。这意味着每个包含该标头的 .cpp 文件都将获得自己的 m 版本。

    相反,您需要将其设为全局(尽管是命名空间范围的)变量。

    在头文件中:

    namespace wtvr{
    extern Matrix m;
    };
    

    在任何 .cpp 文件中:

    namespace wtvr{
    Matrix m;
    };
    

    【讨论】:

    • 如果我们想用一个值初始化怎么办?只需在上面的cpp文件定义中赋值即可?
    【解决方案2】:

    您已将变量声明为static,这意味着每个翻译单元(.cpp 文件)都有自己的副本。你可能是这个意思:

    .h 文件:

    namespace wtvr{
    
    extern Matrix m;  //declare for use from everywhere
    void LoadIdentity(void);
    
    }
    

    .cpp 文件:

    namespace wtvr{
    
    Matrix m;  //define in exactly one .cpp file
    
    void LoadIdentity(void)
    {
      m = Identity();
      m.display();// trace for debugging
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      是的,你应该以不同的方式让你的全球化。

      在.h文件中:

      extern Matrix m;
      

      在其 .cpp 文件中:

      Matrix m;
      void LoadIdentity(void)
      {
          m = Identity();
          m.display();
      }
      

      没有其他文件需要更改。文件范围内的static 意味着每个文件都有自己的变量副本,该副本不与其他文件的变量副本链接,这与您想要的相反。

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 2012-07-30
        • 2011-03-25
        • 1970-01-01
        • 2011-08-31
        • 2017-01-04
        • 1970-01-01
        • 2015-04-22
        • 2021-04-19
        相关资源
        最近更新 更多