静态const字符串不会被初始化

时间:2009-09-23 18:49:23

标签: c++ string static initialization const

我有一些静态const字符串作为我的C ++类的私有成员。我知道.hpp中的声明和.cpp实践中的定义(和初始化)。在类构造函数中,我调用一个使用这些静态字符串的函数。令人惊讶的是,在构造函数中,字符串保持未初始化(空字符串),这会产生问题。

有人可以指出这里可能出现的问题吗?我一直使用静态const字符串,但从未遇到过这种情况。

更新:m_data在utility()中保持为空。我有一个Test类对象作为另一个类的私有成员。

这是我正在使用的一种代码:

// Test.h
class Test
{
public:
  Test();
private:
  void utility();

 static const std::string m_data;
};

// Test.cpp
const std::string Test::m_data = "Data";

Test::Test()
{
utility();
}

void Test::utility()
{
//use m_data here
}

6 个答案:

答案 0 :(得分:5)

您的TEST类型对象是否为全局?

如果是这样,那么您将遇到初始化顺序问题。

int main()
{
    std::cout << "Main Entered" << std::endl;
    Test  t; // This should work
}
Test  plop; // This may not work depending

解决方案是使用静态方法来获取字符串:

class Test
{
    static std::string const& getData()
    {
        static std::string const data("PLOP");
        return data;
    }
    // STUFF
    // Remove this line
    // static const std::string m_data;
    Test::Test()
    {
        std::cout << "Test::Test()" << std::endl;
        Utility();
    }
};
// If "Test::Test()" is printed before "Main Entered"
// You have a potential problem with your code.

答案 1 :(得分:4)

你是这样定义的吗?

class X
{
public:
      static string i;
};
string X::i = "blah"; // definition outside class declaration

请参阅:Static data members (C++ only)

答案 2 :(得分:3)

基于当前代码,我猜你试图创建全局Test实例,很可能是在另一个.cpp文件中。好像你正在遇到可怕的static initialization order fiasco。简单地说:.cpp文件中的全局/静态成员变量将按照它们的定义顺序进行初始化。不保证不同的.cpp文件中的全局变量,你不能依赖于在另一个文件中全局变量之前或之后初始化的一个文件中的var。

答案 3 :(得分:1)

这是你需要的吗?

class blah{
    static const string sz;
public:
    blah(){
        cout<<"blah constructor - string initialized to: "<<sz.c_str()<<endl;
    }
};

const string blah::sz("Hello, Blah!");

int _tmain(int argc, _TCHAR* argv[]){
    blah b;
    return 0;
}

程序输出 blah构造函数 - 字符串初始化为:Hello,Blah!

答案 4 :(得分:0)

我对程序进行了检查,并且工作正常。你正在使用什么IDE? 这在窗口对吗?

你可以使用如果我错误地定义了你自己声明成员的类本身,原因是它是一个const static。

答案 5 :(得分:0)

我会使用不同的方法:

class Test
{
public:
    Test() : m_data( "Data" ) {}
private:
     const std::string m_data;
};

我个人更喜欢这种'风格',它会消除在构造函数中初始化数据的任何问题,这可能是为每个实例构造字符串的次要成本。