[c++] rzutowanie niezależnych klas na siebie

0

o co chodzi z tym kodem:
deklaracja struktur:

class Node
{
public:
	int			x, y;
	int			halfwidth;
	Node		*child[4];
	Node(int x,int y,int hw);
};

// Tjunc - a node from which to create linked lists pointing to game objects
class Tjunc
{
public:
	int			magic;			// TEMP
	GameObject	*gameObject;
	Tjunc		*next;
	Tjunc( GameObject *g, Tjunc *n);
};
w jakiejś tam funkcji:
	Node	*node;
	Tjunc	*ptr;
	Tjunc	*list;
 // [...]
	list = (Tjunc*) node; <font color=green>(*)</font>
	
	// First check if the game object is already in the linked list
	ptr = list;
	while (ptr != NULL)
	{
		if(ptr->gameObject->id == gobj->id )	// found it
			return;								// it's already in the list, do nothing!
		ptr = ptr->next;
	}

	// Add new item to head of the list
	list = new Tjunc( gobj, list );

	prev->child[SW] = (Node*)list; <font color=green>(*)</font>

Byłbym wdzięczny, gdyby ktoś wyjaśnił mi co to za rzutowanie (jak działa) oznaczone <font color="green">(*)</span> , bo przechodzi ono moje pojęcie.

0

normalne, wksaznik do jakiegos typu, lub zle sie przygladalem

0
foflik napisał(a)

normalne, wksaznik do jakiegos typu, lub zle sie przygladalem

patrz temat.

Czy to są całe deklaracje tych struktur/klas? Może jednak nie są niezależne (mają taki sam/podobny wygląd w pamięci) i ktoś hardcore'owo pojechał z takim kodem? :)

0

w tym problem, że są całe, czyli wspólny jest tylko int :/
zamieściłem cały kodzik http://aklimx.cba.pl/2/download/quadtree.zip
istota sprawy znajduje się w quadtree\Source\quadtree.(h|cpp)

0

No bo tu masz odpowiedź:
quadtree.cpp

	// We're below the last level of the tree now, the pointer points to a 
	// linked list of Tjunc elements.
	// cast the node pointer to a Tjunc pointer so we can search
	// the linked list
	list = (Tjunc*) node;		

Po prostu ktoś zaszalał na maxa... Dla mnie to jest C przeniesione do C++, gdzie tylko mam klasy, a dalej to chulaj dusza [vide: class a wszystkie pola public, itp.] [glowa]
Wywal ten kod i znajdź inny [green]
Powodzenia!

0

widziałem ten komentarz, ale mimo to nie wiem jak działa ten kod/rzutowanie.
Jeżeli wiesz, to czy możesz napisać jak to działa? strasznie mnie to intryguje.

0

Hmm, no działa tak, że patrząc na całą strukturę tego "drzewa", prawdopodobnie jego liście nie są już strukturami Node, tylko Tjunc (hmm junk? :> ). Dlatego jest rzutowanie z Node* na Tjunc* i traktowanie liścia jako struktury Tjunc. To tyle.
To tak jakbym miał tablicę wskaźników: char tab[5] i wiedział, że piąty wskaźnik w tej tablicy to nie jest char, tylko np. int* i dał:
int p = (int)tab[4]; żeby go odczytać i coś z nim zrobić (a wcześniej: tab[4] = (char*) new int; :D ).
Totalny hardcore :>

0

no tak, to wiem, tylko w tu jest trochę inaczej, chyba, że się mylę, co jest całkiem możliwe...
jeżeli mam strukturę

class Node
{ public:
	int x, y;
};

to zajmuje ona w pamięci 2x4bajty.
Teraz jeżeli mam drugą strukturę

class Tjunc
{public:
	int magic;
	GameObject *gameObject;
};

To ona też zajmuje 2x4bajty
i jeżeli zrobie rzutowanie *node na *junk to IMO magic bedzie zawierał x, a wskaznik *gameobject y.

I teraz rzecz jest w tym, że w pętli w linijce 106 koder korzysta z właściwości y a w linii 130 ze wsk. gameobject, który IMHO zawiera wartosc z y to jest to taki bezsens, dlatego myślę, że jestem w błędzie...

0

przy okazji chciałbym jeszcze spytać, co to za twór (po co QuadTree:: przed drugim render):

class QuadTree
{
public:
	void render( void );
private:
	void QuadTree::render( Node *node, int cullcode, int level );

};
0

Nie analizowałem dogłębnie tego "super kodu" i nie mam zamiaru, ale operując na wskaźnikach masz tylko adres pewnego miejsca w pamięci, a co za tym idzie to miejsce MOŻE zawierać dane z różnych struktur i jeśli użyjemy rzutowania to te dane możemy spokojnie (?!) odczytać...
Zauważ, że najpierw node=root, następnie zmiana tego node (wartości -> wskazywanego miejsca) przez kilka ifów (// Search in quadtree i pętla for() ) i dopiero stwierdzenie, że już jesteśmy na poziomie, gdzie node -> Tjunc (czy raczej lista Tjunc)...

0
AklimX napisał(a)

przy okazji chciałbym jeszcze spytać, co to za twór (po co QuadTree:: przed drugim render):

class QuadTree
{
public:
	void render( void );
private:
	void QuadTree::render( Node *node, int cullcode, int level );

};

He, jak ktoś tak namieszał, to i mógł sie walnąć w deklaracji... Ale to nic nie zmienia, nadal jest to metoda render dla klasy QuadTree :)

0

trochę zawinięte, ale chyba zaczynam pojmować co ten koleś zrobił... po prostu w najniższym nodzie zamiast robić, że child[0-3] = NULL do oznaczenia, że niżej nic nie ma, po prostu wykorzystał tą pamięć do czego innego - do zapisania informacji z TJunc. Jakby to mój kolega ujął "mądre, nawet nie głupie" :D można też zwrócić uwagę, że sizeof(node)>sizeof(TJunc), bo gdyby tak nie było to wtedy krzaki, albo musiałby przydzielić pamięć dla TJunc* i rzutować ów na Node*. Potem tworzy sobie info o tym ostatnim jako TJunc* i zapisuje do drzewa rzutując na Node*, żeby zgadzały się typy. Koleś był na tyle sprytny, że nie przydzielił wcześniej pamięci na ten ostatni Node.

Kurcze, w ogóle bardzo sprytny ten kod :D ciekawa lekturka

Dzięki za pomoc i poświęcony czas [soczek]

0
AklimX napisał(a)

(...)
Kurcze, w ogóle bardzo sprytny ten kod :D ciekawa lekturka

:/ Eeee...
No a teraz spróbuj dokonać większych zmian w tym kodzie... [diabel]

0
marcinEc napisał(a)
AklimX napisał(a)

(...)
Kurcze, w ogóle bardzo sprytny ten kod :D ciekawa lekturka

:/ Eeee...
No a teraz spróbuj dokonać większych zmian w tym kodzie... [diabel]

Po analizie ten kod potraktowałem raczej jako ciekawostkę niż wzorzec, ale kto wie do czego może mi się to kiedyś przydać...

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