据我所知,下面的代码将导致段故障,因为在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是什么。

如果您交流AB的定义,则代码应该编译和做工精细。由于只要一切都在相同的翻译单元,不应该有与初始化顺序的任何问题,假设定义 B上一页的静态成员的定义C::s_A。在同一个转换单元中定义的对象在其定义的顺序进行初始化,这意味着,到时候A::A()开始,B的静态成员已经被初始化。作为呈现有一个为这种情况下的分割故障的可能。

如果你得到一个分段错误,你必须以不同的做一些事情。定义的顺序不同?多个翻译单位可能?交/描述真实代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top