[C++] Kolejność wczytywania klas, a kompilator...

0

Witam Was Forumowicze

 Zwracam się do Was z prośbą o pomoc. W C++ (w pliku a.h) mam zadeklarowane 2 klasy w następującej postaci ( i kolejności !!!):
//>>>-------(a.h)---------->
class ones
{	
public:
	int ones_x;
	int ones_y;
	 twos twod;
};


class twos
{	
public:
	int twos_x;
	int twos_y;
};

//<---------(a.h)--------<<<

Próba kompilacji zakonczy się fiaskem - co jest oczywiste -
ERRORS:
error C2146: syntax error : missing ';' before identifier 'twod'
error C2501: 'twos' : missing storage-class or type specifiers
error C2501: 'twod' : missing storage-class or type specifiers

Co nalezy zrobić aby kompilator wiedzial, że deklaracja klasy 'twos' jest w dalszej części kodu??

Ps Zmiana kolejności deklaracji klas nie wchodzi w rachubę !!!

Z góry dzięki za pomoc.

0
BRUNO_A_S napisał(a)

class twos; //<<<---deklaracja zapowiadajaca

class ones
{	
public:
	int ones_x;
	int ones_y;
	 twos twod;
};


class twos
{	
public:
	int twos_x;
	int twos_y;
};
0
class twos; //<<<---deklaracja zapowiadajaca

Właśnie tu jest ten problem - ten numer nie przejdzie. W rezultacie kompilator wywali błąd:
"error C2079: 'twod' uses undefined class 'twos'"

0
BRUNO_A_S napisał(a)

Zwracam się do Was z prośbą o pomoc. W C++ (w pliku a.h) mam zadeklarowane 2 klasy w następującej postaci ( i kolejności !!!):
[...]
Co nalezy zrobić aby kompilator wiedzial, że deklaracja klasy 'twos' jest w dalszej części kodu??
Ps Zmiana kolejności deklaracji klas nie wchodzi w rachubę !!!

W takiej postaci po prostu nie da się. Typ MUSI być w pełni ZDEFINIOWANY, żeby można go używać jako obiektu. Jedynie co możesz zrobić to deklaracja zapowiadająca i użycie wskaźnika, ale dlaczego nie możesz zmienić kolejności??? Może nie umiesz zmienić, jeśli to jest część jakiegoś większego projektu??

0

W takiej postaci po prostu nie da się. Typ MUSI być w pełni ZDEFINIOWANY, żeby można go używać jako obiektu. Jedynie co możesz zrobić to deklaracja zapowiadająca i użycie wskaźnika, ale dlaczego nie możesz zmienić kolejności??? Może nie umiesz zmienić, jeśli to jest część jakiegoś większego projektu??

 To że mogę napisać deklarację zapowiadającą istnienie danej klasy to wiem, nie wiem tylko jakiej dokładnie postaci powinna być. Może podałbyś jakiś konkretny zapis deklaracji (do kodu w pliku a.h) ??

 Jeżeli chodzi o kolejność to tutaj został umieszczony tylko i wyłacznie przykład opisujący problem z jakim się napotkałem przy większym projekcie, w przypadku ktorego teoretycznie zmiana kolejności mogłaby być, lecz ze wzgledu chociażby na 

czytelność kodu jest wysoce nie wskazana.

0
BRUNO_A_S napisał(a)

To że mogę napisać deklarację zapowiadającą istnienie danej klasy to wiem, nie wiem tylko jakiej dokładnie postaci powinna być. Może podałbyś jakiś konkretny zapis deklaracji (do kodu w pliku a.h) ??

Wiesz? A vixen co ci napisał (oczywiście bez wskaźnika się nie da)?

BRUNO_A_S napisał(a)

Jeżeli chodzi o kolejność to tutaj został umieszczony tylko i wyłacznie przykład opisujący problem z jakim się napotkałem przy większym projekcie, w przypadku ktorego teoretycznie zmiana kolejności mogłaby być, lecz ze wzgledu chociażby na czytelność kodu jest wysoce nie wskazana.

Bzdura. Żeby nie móc zmienić kolejności dla pseudo "czytelności kodu", gdzie właśnie taka zmiana jest wymagana?!

0

ano rzeczywiscie bez wskaznika sie nie da :-/. albo zmieniasz uklad klas albo lecisz ze wskaznikiem :P

0

Bez wskaźnika się nie da powiadacie hmm. A ja powiem ze wszystko się da.
Ponizej przedstawiam sposób który umożliwia to (nie jest to sposób praktyczny chodzi tylko o udowodnienie Wam że się da inną drogą to zrobić):


```cpp
//>>-------Dla klasy ones-------->
#ifdef _CLASS_TWOS
	#ifndef _CLASS_ONES
	#define _CLASS_ONES 

		class ones
			{
				public:
					int ones_x;
					int ones_y;
					twos twod;
			};
	#include "a.h"
	#endif
#endif
//<-------Dla klasy ones-------<<<

//>>-------Dla klasy twos-------->
#ifndef _CLASS_TWOS
#define _CLASS_TWOS 


	class twos
		{
			public:
				int twos_x;
				int twos_y;
		};


	#include "a.h"
#endif

//<-------Dla klasy twos-------<<<


I co Wy na to  :>  
<b>Poszukam jeszcze jakichś alternatywnych rozwiązań, jakieś sugestie byłyby mile widziane. </b>



Pozdrawiam
0

[sciana]

To pytasz, czy chwalisz się?
Twój pomysł jest dobry jako ciekawostka ukazująca do czego NIE NALEŻY używać makr. Pisz tak, jeśli chcesz, żeby koledzy z zespołu nie odzywali się do Ciebie przez miesiąc. :p

0
Krolik napisał(a)

To pytasz, czy chwalisz się?
Twój pomysł jest dobry jako ciekawostka ukazująca do czego NIE NALEŻY używać makr. Pisz tak, jeśli chcesz, żeby koledzy z zespołu nie odzywali się do Ciebie przez miesiąc. :p

Bez urazy Krolik ale jezeli już się wypowiadasz to poczytaj posty ze zrozumieniem. Gdybyś zwrócił uwagę to napisalem "nie jest to sposób praktyczny"!!!
A przykład ten umiesciłem chociażby dlatego że mialem taki pomysl. Może komuś się kiedyś przyda. Mnie w każdym razie niezabardzo.

Pozdrawiam

0

BRUNO: ja też ci mogę zajebisty, 100% praktyczny sposób pokazać:

class twos
{        
public:
        int twos_x;
        int twos_y;
};

class ones
{        
public:
        int ones_x;
        int ones_y;
        twos twod;
};

Też bez wskaźników, ale nie - TY musisz mieć odwrotnie... Identycznie to samo będzie w tym kodzie z #define'ami. Jeśli nadal nie rozumiesz czym różni się deklaracja od definicji to twój problem. Spróbuj "przeparsować" ten plik tak jak preprocesor i zobaczysz, że to jest dokładnie: definicja twos, i od razu PO niej definicja ones. Żadnej magii ani hardcore'u tu nie ma.
EOT

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