-1

这个主题可能已经被处理了,但我找不到这个问题的解决方案。static const std::string[]我在这样的类中声明一个成员:

.h:

class MyClass
{
private:
    static const std::string cArray[aNumber];

    //other stuff like ctors & all
}

.cpp

const std::string MyClass::cArray[] = {"", "ini", "txt", "bmp"};

这个类包含在我声明static const array[]MyClass 的另一个头文件中。问题是:当这些数组被构建时,m_cArray包含我用来修复其他静态数组中的东西的空字符串。

我在静态初始化顺序问题上看到了一些线程,但没有找到有用的答案。

欢迎提出建议。谢谢

4

3 回答 3

3

您忘记在定义静态成员期间指定cArray属于该类:MyClass

const std::string MyClass::cArray[] = {"", "ini", "txt", "bmp"};
//                ^^^^^^^^^^^^^^^

编辑:

您的问题似乎是 C++ 中未定义静态成员的初始化顺序。

正如这里所说,最优雅的方法是将初始化包装在一个函数中:    

class MyClass
{
private:
    static std::string* Array()
    {
        static std::string cArray[aNumber] = {"", "ini", "txt", "bmp"};
        return cArray;
    }
};

您可以通过以下方式访问您的阵列:

MyClass::Array();

编辑:你在你的例子中纠正了这个错误

也许您的另一个错误可能是您cArray在类声明中命名了您的成员:

class MyClass
{
private:
    static const std::string cArray[aNumber];
    //                       ^^^^^^
};

m_cArray在成员定义中:

const std::string m_cArray[] = {"", "ini", "txt", "bmp"};
//                ^^^^^^^^

我在我的第一个代码示例中更正了这个错误。

于 2013-08-30T12:28:01.297 回答
2

您需要cArray在初始化时说出哪个类是其成员

const std::string MyClass::cArray[] = {"", "ini", "txt", "bmp"};
于 2013-08-30T12:25:08.687 回答
1

您的问题似乎确实源于臭名昭著的静态初始化命令惨败

基本上,当您在一个翻译单元中有一个static变量,在第二个翻译单元X中引用另一个static变量Y时,您的程序有 50/50 的错误行为机会。为了行为正确,Y应该在之前初始化,X但 C++ 不强制执行。

据我所知,处理这个问题的唯一正确方法是使用函数级static变量,它确保m_array将在第一次调用时初始化MyClass::array()(在 C++11 中,甚至可以保证此初始化是线程安全的):

struct MyClass {
    static const size_t arraySize = 4;

    // This function could be defined in a .cpp rather than inline
    // I only put it inside the class for compactness/readability reasons
    static const std::string* array() {
        static const std::string m_array[arraySize] = {"", "ini", "txt", "bmp"};
        return m_array;
    }
};

// In some other file
struct OtherClass {
    // This function could be defined in a .cpp rather than inline
    static void whatever() {
        do_something_with(MyClass::array());
    }
};

换句话说,您应该避免声明static全局变量或类变量(除非您绝对确定它们可以解析为编译时常量,arraySize如上所示),而是将它们包装在函数内部的函数级别static


作为旁注,这个习惯用法使您更容易使用适当的容器而不是传统的 C 数组,例如。std::vector或者,如果您使用的是 C++11,则std::array

// C++03
struct MyClass {
    // This function could be defined in a .cpp rather than inline
    static const std::vector<std::string>& data() {
        static std::vector<std::string> m_data;
        if (m_data.empty()) {
            m_data.push_back("");
            m_data.push_back("ini");
            m_data.push_back("txt");
            m_data.push_back("bmp");
        }
        return m_data;
    }
};

// C++11
struct MyClass {
    using Container = std::vector<std::string>;
    // or
    // using Container = std::array<std::string, 4>;

    // This function could be defined in a .cpp rather than inline
    static const Container& data() {
        static const Container m_data = {"", "ini", "txt", "bmp"};
        return m_data;
    }
};
于 2013-08-30T13:03:53.177 回答