代码之家  ›  专栏  ›  技术社区  ›  Jack BeNimble

如何在C++中构造静态全局变量

  •  0
  • Jack BeNimble  · 技术社区  · 16 年前

    我在编译/链接一组类时遇到一些问题,其中一些类处理一个公共全局变量。

    基本上,我在类A中声明和定义了一个外部变量foo,并在类B和C中访问/更新它。

    相关代码如下:

    A.

    extern string foo; // declare it <=== compiler error "storage class specified for foo"
    

    B.CPP

    include A.h  
    string foo; // define it  
    
    main () {   
    ...  
    foo = "abc";      
    }  
    

    C.CPP

    include A.h  
    cout << foo; // print it  
    

    我当前的错误是“为foo指定的存储类”。但是,我想知道这是不是正确的方法。我应该使用静态变量吗?任何帮助都非常感谢,因为我已经在这上面工作了至少一个小时了。

    8 回复  |  直到 16 年前
        1
  •  2
  •   Troubadour    16 年前

    在A.H中,实际的类A中是否有外部声明?你的问题目前是用文字表达的,但你的代码片段表明它是在文件级别。我能得到您所说的错误的唯一方法,即“为foo指定的存储类”是在a.h中用于以下内容:

    class A
    {
    public:
        extern std::string foo;
    };
    

    也许这是你的问题?

    编辑:看看你自己的答案,我想这就是你所做的。您要替换 extern 具有 static 然后在a.cpp中用类似于

    std::string A::foo;
    

    然后您可以在其他地方访问它 A::foo 如。

    std::cout << A::foo;
    
        2
  •  5
  •   GManNickG    16 年前

    因为你的错误在外,我猜它不知道是什么类型。

    你包括绳子了吗?

    #include <string>

    如果是这样,你需要 std:: 在它之前:

    #include <string>
    extern std::string foo;
    

    旁注,确保你不使用任何 using 指令(指令) using namespace std using std::string )在你的头文件中,因为你强迫所有起诉你头文件的人都这样做,这是不好的做法。

    编辑

    …但我就是这样编码的。

    你确定?我刚试过这个,它在VC++和G++中都很好地工作:

    A.

    #include <string>
    
    extern std::string foo;
    

    B.CPP

    #include "A.h"
    
    std::string foo;
    
    int main (void)
    {   
        foo = "abc";      
    }
    

    C.CPP

    #include "A.h"
    #include <iostream>
    
    int some_function(void)
    {   
        std::cout << foo << std::endl;
    }
    

    试试看它是否有效。

        3
  •  4
  •   EFraim    16 年前

    在文件级别执行。外主()

    弦乐器;

    int()

    }

    否则,它根本就不是全球性的,而是“自动的”

        4
  •  2
  •   haffax    16 年前

    虽然埃弗拉姆的回答是正确的,你的另一个问题是,这是否是正确的方法。答:不,在大多数情况下。

    拥有一个由多个类操纵的全局值只是在乞求问题:使用 外部的 非常微妙。对于任何查看定义了变量的代码的程序员来说,没有明确的提示。他/她必须进行全源扫描才能找到它。此外,很难确定什么类更改了应用程序控制流中的值,全局变量将不同的类与不可见的带绑定在一起。好的设计使类之间的协作显式化。

    更好:使您的全球 singleton . 这样,您至少可以知道值的定义位置,并且可以通过访问方法控制对值的更改。 更好的方法是:找出为什么这些类必须访问相同的值,找出哪些类完全取决于哪个方面,并相应地修改设计。经常使用 外部的 只是一个深层次设计问题的快速解决方案。

        5
  •  1
  •   Jack BeNimble    16 年前

    TT看起来好像C++没有让你使用“外部”来做任何事情,除了对象或函数:

    http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/extsc.htm

    “C++限制使用外部存储类说明符到对象或函数的名称。将外部说明符与类型声明一起使用是非法的。外部声明不能出现在类作用域中。“

    回到画板上…

        6
  •  1
  •   GManNickG    16 年前

    GMAN的回答是正确的:如果不包括字符串,则试图实例化一个未定义的类型,从而导致错误。

    标准中引用的内容并不恰当:Jack没有试图将类型定义为静态类型,而是试图实例化一个对象。

    是的,你只能做像

    class foo {
      // ...
      static int hoo; // class variable same in all instances of foo
      // ...
    };
    

    …但杰克不是这么做的。

    为什么我所有的代码都会在这个bbs中被破坏?上周提出了一个关于C指针的答案,当我想要单指针的时候,我得到了双星号!

        7
  •  1
  •   Jim Buck    16 年前

    除了将定义移出main之外,请确保在extern声明之前包含字符串头:

    #include <string>
    
        8
  •  0
  •   David Nehme    16 年前

    定义foo时,在函数main中定义局部变量。当你链接时,你会得到一个丢失的符号,因为你的外部foo;从未被创建过。您需要在函数外部定义foo。

    捕获信号

    string foo;
    int main () {
       foo = "abc";
    }
    

    更好的是,你应该试试单件的。