Przypisanie wartości statycznej zmiennej poza funkcją po wywołaniu konstruktora

0

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.

1

Zanim odpisze, szybkie pytanie:
Czy w tej pierwszej klasie - A - Name też powinno być statyczne w Twoim przykładzie?

I drugie:
Czy w Twoim kodzie istnieją jakieś globalne/statyczne obiekty klas A, B, C lub Head_Logic?

0
Kamil9132 napisał(a):

jednej klasie wartości do zmiennych statycznych są przypisywane po wywołaniu konstruktora

Że co? Twój kod jest po prostu bezsensu, popatrz na to:

Kamil9132 napisał(a):
B::B()
{
	A::Name = this->Name; // co to niby robi? Przypisanie samo do siebie!
}

Prawda jest taka, ze dałeś bezsensowne nazwy, które kolidują ze sobą i przez to zupełnie się pogubiłeś.
Zmień nazwę pola statycznego, na np: DefaultObjectName (chyba dobrze się domyślam co niby to am robić) albo coś powodowym stylu, a zobaczysz jak namieszałeś!

0

@Gynvael Coldwind
Na początku Name w klasie A było statyczne, ale usunąłem słowo static, przy próbie przypisania tak jak jest w pokazanym kodzie Name zmieniało się za każdym razem, przez co wszystkie obiekty miało to samo.

W pliku main.cpp znajduje się jeden obiekt klasy Head_Logic jako zmienna globalna.

@MarekR22
Odnośnie nazw to masz rację, że mogłem dać inne, jednak z tym że jest to główny problem nie mogę się zgodzić. W 2 z 3 klas zmienna ustawia się prawidłowo, tylko w jednej jest błąd, przy takim samym kodzie, więc problem jest inny.

0
  1. jaki kompilator? jaka platforma? Jaka wersja C++ (od 11 zmienił się sposób inicjalizacji niektórych obiektów statycznych).
  2. opisz dokładniej co się dzieje. Możesz dopisać do kodu logi i podać logi. Opisz też czego oczekujesz od swojego kodu!
0

Środowisko Visual Studio 2015 Community, kompilatora nie zmieniałem.

Celem jest wczytanie danych z pliku, każda z klas B i C ma osobną plik, jednak wczytywanie wygląda tak samo w obu klasach, więc zajmuje się tym nadrzędna klasa A.
Dodatkowo jest kilka przycisków (WinApi), odpowiadających za to czy dana klasa ma być używana, nazwy przycisków są pobierane od klasy A.

Head_Logic.h

class Head_Logic
{
	struct Single_A
	{
		A * A_Pointer;

		std::wstring Name;

		int Config_Active_Index;

		bool Active;

		Single_A(A * A_Pointer, int Config_Active_Index, Login_Config_File &Login_Config_File_Instance)
		{
			this->A_Pointer = A_Pointer;
			this->Config_Active_Index = Config_Active_Index;
			this->Active = Login_Config_File_Instance.Get_Value(Config_Active_Index) == 1;
		}

		void Set_Active(bool Active, Config_File &Config_File_Instance)
		{
			this->Active = Active;

			Config_File_Instance.Set_Value(Config_Active_Index, 0, Active ? 1 : 0);
		}
	};

	std::vector<Single_A> As;

	Login_Config_File Login_Config_File_Instance;
	Register_Config_File Register_Config_File_Instance;

	B B_Instance;
	C C_Instance;

public:
	void Initialize(std::array<std::vector<HWND>, Globals::Login_Buttons_A_Size> &Login_Buttons, std::array<std::vector<HWND>, Globals::Register_Buttons_A_Size> &Register_Buttons, Menu &Menu_Instance);

Head_Logic.cpp

void Head_Logic::Initialize(std::array<std::vector<HWND>, Globals::Login_Buttons_A_Size> &Login_Buttons, std::array<std::vector<HWND>, Globals::Register_Buttons_A_Size> &Register_Buttons, Menu &Menu_Instance)
{
	this->Register_Buttons = &Register_Buttons;

	Login_Config_File_Instance.Load_Config();
	Register_Config_File_Instance.Load_Config();

	As.push_back(Single_A(&B_Instance, Login_Config_File::B_Status, Login_Config_File_Instance));
	As.push_back(Single_A(&C_Instance, Login_Config_File::C_Status, Login_Config_File_Instance));

	std::vector<std::wstring> Names;
	std::vector<bool> Actives;

	for (size_t TB_01 = 0; TB_01 < As.size(); ++TB_01)
	{
		As[TB_01].A_Pointer->Initialize(Login_Config_File_Instance, Register_Config_File_Instance, Login_Buttons[TB_01]);
		As[TB_01].Name = As[TB_01].A_Pointer->Name;
		Names.push_back(As[TB_01].Name);
		Actives.push_back(As[TB_01].Active);
	}

	Menu_Instance.Initialize_As(Names, Actives);

	size_t Max_Size = 0;

	for (auto &TB_01 : As)
	{
		if (TB_01.A_Pointer->Get_Login_Accounts_Size() > Max_Size) Max_Size = TB_01.A_Pointer->Get_Login_Accounts_Size();
	}

	Login_Config_File_Instance.Load_Random_Indexes(Max_Size);

	for (auto &TB_01 : As) TB_01.As_Pointer->Update_Buttons(true);

1 użytkowników online, w tym zalogowanych: 0, gości: 1