在一个静态变量的构造检索静态常量的值
-
27-09-2019 - |
题
据我所知,下面的代码将导致段故障,因为在A处的CSTR,B :: SYMBOL尚未初始化。但是,为什么?
在现实中,A是用作映射的样B类符号映射到它们各自的ID的对象。 Ç持有该图(A)静态-LY使得其能够提供映射为一类功能。
一个的主要功能是作为一个地图对于C,在启动时的初始化工作。我应该如何能够做到,如果没有分段故障,只要我仍然可以使用B :: ID和B :: SYMBOL在代码(没有的#define PLS)?
(PS。假设我已经实现了包括罩)
//A.h
#include "B.h"
class A
{
public:
A()
{
std::cout<<B::ID<<std::endl;
std::cout<<B::SYMBOL<<std::endl;
}
};
//B.h
class B
{
public:
static const int ID;
static const std::string SYMBOL;
}
//B.cpp
#include "B.h"
const int B::ID = 1;
const std::string B::SYMBOL = "B";
//C.h
#include "A.h"
class C
{
public:
static A s_A;
};
//C.cpp
#include "C.h"
A C::s_A;
//main.cpp
#include "C.h"
int main(int c, char** p)
{
}
解决方案
S_A使用延迟初始化。这可能工作:
class C
{
public:
static A& getA() { static A s_A; return s_A; }
};
或者:
class C
{
public:
static A& getA()
{
if( ps_A == NULL) ps_A = new ps_A;
return *ps_A;
}
private:
static A* ps_A;
};
A* C::ps_A = NULL;
既不溶液是线程安全的。
其他提示
什么分段错误你在说什么?您的代码根本不会编译,因为B
(和B
本身)的成员都没有的宣布的A::A()
之前。编译器只是不知道B
是什么。
如果您交流A
和B
的定义,则代码应该编译和做工精细。由于只要一切都在相同的翻译单元,不应该有与初始化顺序的任何问题,假设定义 B
上一页的静态成员的定义的C::s_A
。在同一个转换单元中定义的对象在其定义的顺序进行初始化,这意味着,到时候A::A()
开始,B
的静态成员已经被初始化。作为呈现有一个为这种情况下的分割故障的可能。
如果你得到一个分段错误,你必须以不同的做一些事情。定义的顺序不同?多个翻译单位可能?交/描述真实代码。
不隶属于 StackOverflow