Проблема инициализации статической переменной c ++ - ссылка на другой статический констант - PullRequest
0 голосов
/ 28 сентября 2018

Я пытался объявить две статические переменные в двух разных .cpp, одна пытается использовать другую во время инициализации (например, класс B -> класс A).Код может быть скомпилирован, если у меня есть main.cpp, который включает в себя ах и бх. Он завис во время выполнения (ошибка сегментации (ядро сброшено)).Я понимаю, что это проблема с инициализацией статической переменной, статическая переменная A еще может быть инициализирована во время инициализации статического объекта B.

Могу ли я спросить, как правильно решить проблему такого рода, изменивкакой код или какой-либо шаблон проектирования помогли бы?

Я видел пост, в котором говорилось, что "constexpr" используется для инициализации A :: инициализации во время компиляции, я засосал синтаксическую ошибку.

static constexpr std::string a;     // in a.h
constexpr std::string A::a="AAA";   // in a.cpp

ошибки:

a.h:7:34: error: constexpr static data member ‘a’ must have an initializer
     static constexpr std::string a;

a.cpp:4:26: error: redeclaration ‘A::a’ differs in ‘constexpr’
 constexpr std::string A::a="AAA";

Полный код указан ниже: ах

#include <string>
using namespace std;

class A
{
public:
    static const std::string a;
    A();
    ~A();
};

a.cpp

#include "a.h"
using namespace std;

const std::string A::a("AAA");
A::A(){};
A::~A(){};

чч

#include <string>
using namespace std;


class B
{
public:
    B(const std::string& a );
    ~B();
};

b.cpp

#include "b.h"
#include "a.h"
#include <iostream>

static const B b(A::a);

B::B(const std::string& s){ cout <<"B obj::" << s << endl; };
B::~B(){};

Я думал о создании глобальной функции получения

getA()
{
   static std::string A::a;  //hope that would force A::a initialization
   return A::a;
}

, а затем

static B b(getA())

выглядит ужасно ...

1 Ответ

0 голосов
/ 28 сентября 2018

То, что вас кусает, было названо статическая проблема порядка инициализации .Это считается "классической" проблемой.Идея обойти это состоит в том, чтобы управлять вручную "порядком инициализации переменных.

Вот классическая запись FAQ об этом: https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use.

...