Глобальные константные переменные не назначаются при выполнении конструктора - PullRequest
0 голосов
/ 23 ноября 2018

MY_GLOBAL_CONST не назначается, когда я пытаюсь использовать его в ProblemClass::ProblemClass().Зачем?Как это исправить?Я работаю над старым проектом VFC MFC.

SomeClass.h

#include "ProblemClass.h"
class SomeClass  
{
private:
    ProblemClass m_problemClass; //created on the heap

public:
    SomeClass();
    ~SomeClass();
}

ProblemClass.h

class ProblemClass
{
public:
    ProblemClass();
    ~ProblemClass();
}

ProblemClass.cpp

#include "ProblemClass.h"
const CString MY_GLOBAL_CONST = _T("User");//Also tried to put that line in ProblemClass.h without luck
ProblemClass::ProblemClass()
{
    CString foo = MY_GLOBAL_CONST; //MFC-Runtime assertion fails, MY_GLOBAL_CONST  is not assigned yet 
}
ProblemClass::~ProblemClass(){}

Обновление:

После некоторых дальнейших исследований я могу подтвердить, что SomeClass также создается вглобальный контекст.Итак, Пол Сандерс абсолютно прав, говоря, «здесь происходят два глобальных инициализатора, выполняющиеся в неправильном порядке» .

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Попробуйте заменить:

const CString MY_GLOBAL_CONST = _T("User");

на:

const TCHAR MY_GLOBAL_CONST [] = _T("User");

Последняя конструкция не требует инициализации во время выполнения, поэтому на MY_GLOBAL_CONST можно положиться при другой инициализациикод (потому что то, что здесь обязательно происходит, это два глобальных инициализатора, которые выполняются в неправильном порядке).

0 голосов
/ 23 ноября 2018

Похоже, вы пропустили ключевое слово static с вашей декларацией.Мой рецепт для глобальных переменных, которые нужно инициализировать вне класса.

Заголовочный файл

class ProblemClass
{
public:
    ProblemClass();
    ~ProblemClass();

private:
    static const CString MY_GLOBAL_CONST; // declaration in the header file
}

Исходный файл

const CString ProblemClass::MY_GLOBAL_CONST = _T("HELLO_WORLD"); // Initialization here outside of class

ProblemClass::ProblemClass()
{
    CString foo = MY_GLOBAL_CONST; //MFC-Runtime assertion fails, MY_GLOBAL_CONST  is not assigned yet 
}

// everything else
...