Problém s globálním statickým ukazatelem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s globálním statickým ukazatelem – C / C++ – Fórum – Programujte.comProblém s globálním statickým ukazatelem – C / C++ – Fórum – Programujte.com

 

MiCizek0
Stálý člen
20. 5. 2016   #1
-
0
-

Dobrý den, tvořím herní engine a chtěl bych použít několik handle pro třídy objektů jako globální statické ukazatele. Tyto ukazatele tvořím hned pod jejich třídou, které z kterých nejprve vytvořím nulový ukazatel. (př1) Potom v konstruktoru té třídy inicializuji ten konstruktor, aby ukazoval na tu instanci té třídy. (př2)

Problém je, že ukazatel má inicializovanou adresu pouze v tom bloku, kde byl vytvořen. V ostatních blocích je nulový. (kdybych se dopustil nějaké špatné terminologie, tak mě když tak opravte ;-))

 př 1:

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

	void Init(ID3D11Device* device, ID3D11DeviceContext* dc, Camera *cam, UINT numObjects = 32, UINT numInstances = 32);
	void Update();
	void Render();

	int CreateObject(GameObject *object);
	int CreateInstances(int objID);
	void DestroyObjectByID(int id);
	void DestroyInstanceByID(int id);

	GameObject* GetGameObjectByID(int id) { return gameObjects[id]; }
	GameInstance* GetGameInstanceByID(int id) { return gameInstances[id]; }
private:

	ID3D11Device* mDevice;
	ID3D11DeviceContext* mDC;
	Camera *mCam;

	IDStack *idObjectStack;
	IDStack *idInstanceStack;
	std::vector<GameObject*> gameObjects;
	std::vector<GameInstance*> gameInstances;

	int m_numObjects;
	int m_numInstances;
};

static GameObjectsStack *GameObjectStackHandle = 0;

#endif //GAME_OBJECT

př2:


GameObjectsStack::GameObjectsStack()
{
	GameObjectStackHandle = this;
}
Nahlásit jako SPAM
IP: 109.81.211.–
Radek Chalupa
~ Redaktor
+1
Super člen
20. 5. 2016   #2
-
0
-

#1 MiCizek
Pokud jsem to dobře pochopil, problém je v tom že tu globální proměnnou nemáš extern. Pokud je to ve Visual Studiu, nejjednodušší je před deklaraci dát
__declspec(selectany) 
 

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
q
~ Anonymní uživatel
219 příspěvků
20. 5. 2016   #3
-
0
-

1. Dokola omílaná věc. Jde o to, že include vloží obsah zadaného souboru na místo toho include - když tam máš definici proměnné, tak se ti všude definuje znova.

2. static u globální proměnné znamená, že je interní a není "vidět" zvenku. To asi není to, co chceš. Takže to vyhoď - tím pak bude fungovat i Radkův selectany.

3. když už toto, tak se to normálně dělá takto:
soubor.h: extern blabla neco;
soubor.cpp: blabla neco;

4. Připomíná to singleton, inspiruj se tam, jak to napsat hezčeji.

Nahlásit jako SPAM
IP: 213.211.51.–
MiCizek0
Stálý člen
22. 5. 2016   #4
-
0
-

Tak kod normalně píšu ve formatu

blabla.h 

#ifndef BLABLA_H
#define BLABLA_H

blabla neco

#endif //BLABLA_H

blabla.cpp

#include "blabla.h"

blabla neco

Základní třídou mého enginu je třída d3dApp, kde všechno dávám do hromady a ostatním třídám posílám buď ukazatel na třídu nebo proměnou ostatním třídám s pomoci volání funkce Init(něco) akorát tech vstupů do Init funkcí už je nějak moc, proto mám dvě možnosti jak to řešit. A to buď použít globální singleton nebo vytvořit strukturu, tam všechno hodit a posílat ostatním instancím tříd jen ukazatel téhle struktury

Nahlásit jako SPAM
IP: 109.81.211.–
BDS+3
Věrný člen
22. 5. 2016   #5
-
0
-

#4 MiCizek
nevím jak ostatní, ale já jsem nepochopil formulaci "má inicializovanou adresu pouze v tom bloku, kde byl vytvořen. V ostatních blocích je nulový"

Další věc co nechápu je, k čemu potřebuješ statický odkaz na tu třídu. Přece stačí mít statické proměnné, které mít statické potřebuješ. Příklad: 

class Trida
{
 public: 	
 static int hodnota; //proměnná společná pro všechny třídy tohoto typu
 Trida(int v)
	{
	 hodnota = v;
	};
};

int Trida::hodnota = 0; // nastavení výchozí hodnoty

int main()
{
	Trida *t1 = new Trida(2001);
	cout << Trida::hodnota << endl; //2001
	Trida *t2 = new Trida(2002);
	cout << Trida::hodnota << endl; //2002

	cout << t1->hodnota << endl;    //2002

	delete t2;
	delete t1;
	return 0;
}

(nicméně stejně jako mám tady statický int, tak ty si tam můžeš dát i statickou třídu..) Samozřejmě to můžeš nastavit třeba jako extern, jak už ti tu bylo popsáno.

Tvůj poslední příspěvek, jsem už vůbec nepochopil.;)

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
q
~ Anonymní uživatel
219 příspěvků
23. 5. 2016   #6
-
0
-

#4 MiCizek
Fajn, jen do toho .h přídej "extern" a vyhoď "static".

Nahlásit jako SPAM
IP: 213.211.51.–
q
~ Anonymní uživatel
219 příspěvků
23. 5. 2016   #7
-
0
-

#5 BDS
má inicializovanou adresu pouze v tom bloku, kde byl vytvořen. V ostatních blocích je nulový

Tím, jak se mu ta proměnná definuje všude, kde to inkluduje (a protože je static, tak to nikde neřve), tak v tom konstruktoru přiřazuje do jiné proměnné, než na kterou kouká, když z něj vyleze (v jiném souboru).

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý