[ ZenMajstor @ 10.03.2004. 13:47 ] @
Stvarno je ovaj C++.NET nevjerovatan.

Imam 5 klasa: KlasaBazna
KlasaIzvedena1
KlasaIzvedena2
KlasaSaKontejnerima
KlasaKorisnickiException

Sve se klase nalaze u istom namespace-u. I sve su pisane u zasebnim fajlovima sa deklaracijama u .h fajlovima i implementacijama u .cpp fajlovima.

sada: public __gc class KlasaIzvedena1:public KlasaBazna
public __gc class KlasaIzvedena2:public KlasaBazna

naravno u .h fajl izvedenih klasa ukljucio .h fajl bazne klase KlasaBazna (#include "KlasaBazna.h")
---------------------------------------------------------------------------
PARADOX1
KlasaSaKontejnerima sadrzi objekte klasa KlasaIzvedena1 i KlasaIzvedena2:

KlasaIzvedena1 * ptr1;
KlasaIzvedena2 * ptr2;

naravno u KlasaSaKontejnerima.h fajl ukljucio KlasaIzvedena1(2).h

sve radi BEZ PROBLEMA
---------------------------------------------------------------------------
PARADOKS2
Sada u KlasaIzvedena1(2) mi treba objekat klase KlasaKorisnickiException, i da bih ga napravio moram u KlasaIzvedena1(2).h ukljuciti KlasaKorisnickiException.h

i sta se desava??

error: class type redefinition i pokazuje na KlasaKorisnickiException

jasno mi je da je to zbog toga sto u KlasaSaKontejnerom.h imam #include "KlasaIzvedena1" i #include "KlasaIzvedena2" a posto je u obe klase ukljucen KlasaKorisnickiException.h kao da ga dva puta ispisuje!

Ali zasto je prije toga radilo bez problema (POGLEDATI PARADOX1).
-----------------------------------------------------------------------------
Problem sam resio kasnije drugacijim dizajnom, ali i dalje me ovaj paradoks zbunjuje!!??
[ Dragi Tata @ 10.03.2004. 16:14 ] @
Citat:
ZenMajstor:

error: class type redefinition i pokazuje na KlasaKorisnickiException

jasno mi je da je to zbog toga sto u KlasaSaKontejnerom.h imam #include "KlasaIzvedena1" i #include "KlasaIzvedena2" a posto je u obe klase ukljucen KlasaKorisnickiException.h kao da ga dva puta ispisuje!



A je si li stavio #pragma once na početak svojih header fajlova?
[ havramm @ 11.03.2004. 08:49 ] @
Citat:
Dragi Tata:
Citat:
ZenMajstor:

error: class type redefinition i pokazuje na KlasaKorisnickiException

jasno mi je da je to zbog toga sto u KlasaSaKontejnerom.h imam #include "KlasaIzvedena1" i #include "KlasaIzvedena2" a posto je u obe klase ukljucen KlasaKorisnickiException.h kao da ga dva puta ispisuje!



A je si li stavio #pragma once na početak svojih header fajlova?


Mislim da je bolje da ceo header zaokruzi sa jednim #IFNDEF - #ENDIF, nesto kao ovo:
Code:

#IFNDEF _KLASA_1_
#DEFINE _KLASA_1_

class Klasa1
{
    ....
};

#ENDIF

time obezbedjuje da ma koliko puta header bio uvucen, uvek ce se samo jednom proci kroz njega
[ Reljam @ 11.03.2004. 09:01 ] @
Havramm, to je upravo ono sto je Nemanja gore napisao, samo sto se to u zadnjih nekoliko verzija Visual Studija zove #pragma once. Ako covek vec koristi VS.NET, onda bi mu bilo bolje da koristi '#pragma once' umesto starijeg '#ifdef / #define / #endif' nacina.
[ havramm @ 11.03.2004. 12:09 ] @
OK, nisam znao za to... Davno sam polagao cpp, a i dosta vremena ga vec ne koristim... U svakom slucaju hvala na informaciji
[ ZenMajstor @ 12.03.2004. 07:49 ] @
Hvala vam, upravi je ti i bilo. Ono sto me zbunilo (jedno radi drugo ne radi) je to sto sam u jednom .h fajlu (onom koji je radio ispravno to ukljucio), ali u drugom nisam i naravno nije radio. Ja sam toliko bio premoren da to nisam u tom trenutku video.

Hvala jos jednom!!!
[ leka @ 12.03.2004. 12:02 ] @
Code:
Ako covek vec koristi VS.NET, onda bi mu bilo bolje da koristi

'#pragma once' umesto starijeg '#ifdef / #define / #endif'

nacina.
Predlazes li ovo i programerima koji (bi trebalo) da

pokusavaju da pisu portabilan kod, a koji koriste VisualStudio kao

alatku (recimo ja sam jedan o takvih)? :)
[ srki @ 12.03.2004. 13:48 ] @
Zar nije koriscenje #pragma once dovoljno portabilno?
[ alex @ 12.03.2004. 14:03 ] @
Koliko je meni poznato, velika vecina C/C++ preprocesora podrzava #pragma once direktivu, medju kojima je svakako i GCC (sto Leku, verujem, najvise i zanima).

With that said, osim ukoliko ne razvijate neki specijalizovan embedded kôd sa custom-made kompajlerom , nema nikakve bojazni od koriscenja te direktive.
[ Reljam @ 12.03.2004. 16:27 ] @
Leka, znas ti mene: treba koristiti alat koji je primeren poslu - ako covek programira u managed C++u, onda treba da koristi VS.NET ekstenzije. A i inace treba da koristi one ekstenzije koje postoje na platformama koja predstavljaju 90% njegovih klijenata, ma koja platforme to bile. ;)