C ++中的简单属性访问不起作用

时间:2018-11-20 03:51:01

标签: c++

每个文件都应位于同一目录中,并且可以逐字复制。我遇到了一个非常奇怪的属性访问问题,对于我目前对C ++的了解我不了解。

main.cpp

#include "someclass.hpp"

SomeClass d = SomeClass();

int main(int argc, const char * argv[])
{
    SomeClass c = SomeClass();

    return 0;
}

someclass.hpp

#ifndef someclass_hpp
#define someclass_hpp

class SomeClass
{
public:
    SomeClass();
};

#endif /* someclass_hpp */

someclass.cpp

#include "someclass.hpp"
#include <iostream>

std::string s = "hi";

SomeClass::SomeClass()
{
    std::cout << "\"" + s + "\"" << std::endl;
}

控制台

$ g++ main.cpp someclass.hpp someclass.cpp 
$ ./a.out
""
"hi"

我已经完成了一个相当大的项目,并删除了所有内容,直到剩下这个非常简单的错误为止,我一直盯着它看了一个小时,无法解决问题。这是我未考虑正确方法的简单问题吗?据我所知,代码应该输出两次“ hi”,是什么使 a 的初始化上下文与 b 有所不同?

我目前可以解决“不要在方法之外初始化变量”,但是我仍然很好奇为什么会发生这种情况。

2 个答案:

答案 0 :(得分:2)

请记住,std::string s = "hi";SomeClass d = SomeClass();都是全局初始化的,并且初始化的顺序不是 保证。这也可能导致不确定的行为。

仅供参考:您的示例在最新的Fedora上崩溃了。


UPD 正如@davidbak正确提到的那样,我的答案是关于不同编译单元中全局初始化的顺序。

答案 1 :(得分:1)

全局变量初始化不能保证顺序。由于std::string s = "hi";SomeClass d = SomeClass();都在全局范围内,因此在创建SomeClass d时,string s未初始化,因此""输出。正如dshil正确指出的那样,这将导致不确定的行为,应该避免。