Witam.
Czy w C++ wartość może zostać przypisana do zmiennej statycznej po wywołaniu konstruktora?
Dotychczas byłem pewny, że zmienne statyczne są przypisywane na samym początku, przed wywołaniem jakiejkolwiek funkcji, jednak przed chwilą podczas debugowania odkryłem, że w jednej klasie wartości do zmiennych statycznych są przypisywane po wywołaniu konstruktora, przez co dalszy kod wykonuje się nieprawidłowo.
A.h
#pragma once
class A
{
public:
std::wstring Name;
}
B.h
#pragma once
#include "A.h"
class B : public A
{
static const std::wstring Name;
public:
void Initialize(Config_File &Config_File_Instance, std::vector<HWND> &Buttons);
B();
};
B.cpp
#include "B.h"
const std::wstring B::Name = L"Text";
void B::Initialize(Config_File &Config_File_Instance, std::vector<HWND> &Buttons)
{
...
}
B::B()
{
A::Name = this->Name;
}
C.h
#pragma once
#include "A.h"
class C : public A
{
static const std::wstring Name;
public:
void Initialize(Config_File &Config_File_Instance, std::vector<HWND> &Buttons);
C();
};
C.cpp
#include "C.h"
const std::wstring C::Name = L"Text_C";
void C::Initialize(Config_File &Config_File_Instance, std::vector<HWND> &Buttons)
{
...
}
C::C()
{
A::Name = this->Name;
}
Head_Logic.h
#pragma once
#include <Windows.h>
#include "B.h"
#include "C.h"
class Head_Logic
{
B B_Instance;
C C_Instance;
public:
//....
};
Rozwiązaniem problemu jest przeniesienie kodu z konstruktora do funkcji Initialize
, jednak jestem ciekawy dlaczego tak się dzieje.
Kod przypisujący wartość do zmiennej statycznej Name
oraz konstruktor jest identyczne w klasach B
i C
, a jednak w klasie B
w konstruktorze statyczna zmienna Name
ma wartość, a w klasie C
w konstruktorze zmienna pozostaje pusta, dopiero przy wywołaniu funkcji Initialize
ma prawidłową wartość.
W projekcie mam 3 klasy dziedziczące po A
, w dwóch w konstruktorze statyczna zmienna Name
ma wartość, a w trzeciej pozostaje pusta.
Środowisko jakiego używam to Visual Studio 2015 Community.
Nazwy A, B oraz C są tylko przykładowymi, w kodzie występują inne.