C++ kérdés, van olyan, aki tudja miért így "kell"?
Iskolában tanították így, de magyarázatot nem kaptam, hogy miért így kell. Szóval:
egy osztály definiálásánál
class A{
private:
....
public:
A();
A(...);
....
};
A::A(){...} stb.
Azt nem értem, hogy miért az osztályon kívül kell leírni a metódus műkködését, miért nem az osztályon belül?
Illetve a másik amit nem értek az az, hogy 2 db külön file-ba kell tenni ezeket, az osztálydeklarációt egy xyz.hpp file-ba, s a működését egy xyz.cpp fileba. Miért nem egy db header file-ba rakjuk?










Nem feltétlenül kell így csinálni, teheted az osztályba is a metódusok definícióját, azonban általában okosabb döntés különszedni a metódus deklarációját és definícióját.
Ha a header fájlokban lenne a definíció, s több cpp állományba is includeolnád azt a bizonyos header fájlt, akkor a linker panaszkodna, hogy több szimbólum is létezik ugyanazzal névvel.





"a linker panaszkodna, hogy több szimbólum is létezik ugyanazzal névvel"
Biztos ez?





Tegyük fel, hogy van egy class A osztályod, amit más fordítási egységekben is használni szeretnél. Ezekben meg kell jelennie a deklarációjának, hogy a fordító ismerje a hívási szekvenciákat, stb., de kódot nem fordít belőle, hiszen akkor ahány fordítási egységben használnád, mindenütt megjelenne a konkrét kódja is. Ezért a header fájlba érdemes csak deklarációkat tenni, és külön leírni a hozzá tartozó implementációt, hogy csak egyszer (szeparáltan) létezzen a lefordított kódja. Így a tárgykódban nem fog feleslegesen megjelenni a kód, csak a linker fogja feloldani a hivatkozásokat a külön lévő tárgykód felé.
Na ezt most elég katyvaszosan írtam le, de a lényeg, hogy nagyobb projektek esetén mindenképpen érdemes külön tenni a metódusok kódját. Kis példaprogramokban nincs akkora jelentősége.
További kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!