[Klasy, C++] Prośba o sprwdzenie kodu źródłowego
Ostatnio zmodyfikowano 2010-08-07 20:17
huberthx Temat założony przez niniejszego użytkownika |
[Klasy, C++] Prośba o sprwdzenie kodu źródłowego » 2010-08-07 19:09:29 Kod: klasy.h: class otoczenie { public: float tlen; float tlenatmosfera; float pobierztlen(); }; class woda : public otoczenie { public: float tleniwoda; float pobierztlenodotoczenia(); woda() { tlen = 0, tlenatmosfera = 0, tleniwoda = 0, pobierztlen(), pobierztlenodotoczenia(); }; ~woda() { }; }; funkcje.cpp: #include "klasy.h" float otoczenie::pobierztlen() { return tlenatmosfera =( tlen * 0.6 ); }; float woda::pobierztlenodotoczenia() { return tleniwoda =( tlenatmosfera / 2 ); }; main.cpp: #include <iostream> #include "klasy.h"
main() { woda * wodaobiekt = new woda; std::cin >> wodaobiekt->tlen; wodaobiekt->pobierztlen(); wodaobiekt->pobierztlenodotoczenia(); std::cout << wodaobiekt->tleniwoda; delete wodaobiekt; }; Czy te konstruktory i destruktory są poprawne? Czy jeżeli nie zastosuje destruktora to czy straconą pamięć da się w jakikolwiek sposób odzyskać? Wiem że to są małe straty ale co by było gdyby był to jakiś większy projekt a tak po za tym to lepiej nabierać dobrych nawyków od początku. P.S. Program się kompiluje i działa jak należy. |
|
kamillo121 |
» 2010-08-07 19:18:19 Klasy bazowe powinny mieć wirtualny destruktor. class Base { public: virtual ~Base(); };
class TraTa : Base { public: ~TraTa(); };
class BaseF { public: virtual ~BaseF(); };
class BaseN : BaseF { public: virtual ~BaseN(); };
class TraTa : BaseN { public: ~TraTa(); };
|
|
huberthx Temat założony przez niniejszego użytkownika |
» 2010-08-07 19:35:58 czy po dopisaniu : virtual ~otoczenie() {}; w klasie otoczenie na ostatnim miejscu po public czy wtedy mój kod jest wolny od niebezpiecznych błedów? Pytam tak szczegółowo ponieważ wiadomo że kompilator mi tego nie pokaże. |
|
kamillo121 |
» 2010-08-07 19:39:17 co do tworzenia instancji tej klasy to tak(jeśli dodasz virtualny destruktor) ale musisz też uważać na inne tego typu rzeczy, np możesz gdzieś w środku w klasie mieć taki zapis: int * a = new int; * a = 200;
i jak nie zwolnisz tego miejsca w pamięci to od masz do czynienia z wyciekiem pamięci więc musisz też zadbać o zwalnianie pamięci int a *= new int; * a = 200; delete a;
jak o tym będziesz pamiętał to raczej jest to bezpieczne ;] Tak powinieneś dodac w klasie bazowej otoczenie destruktor virtualny i obiekty tej klasy będą poprawnie zwalniać całą pamięć. //edit tam była pomyłka zamiast virtualny konstruktor to destruktor :) |
|
huberthx Temat założony przez niniejszego użytkownika |
» 2010-08-07 19:44:22 Dziękuję za pomoc. |
|
kamillo121 |
» 2010-08-07 19:50:07 jeśli na twój temat ktoś dał Ci satysfakcjonującą odpowiedź dla ciebie i rozwiązał problem to zamykaj temat, co by nie uprzykrzać życia administratorom serwisu ;) Zawsze w razie czego możesz potem otworzyć temat. |
|
Elaine |
» 2010-08-07 20:11:47 Administratorom? Czemu w liczbie mnogiej, skoro jest tylko jeden? |
|
lenrokskate |
» 2010-08-07 20:17:06 to był chyba skrót myślowy - pewnie mu chodziło o moderatorów :D |
|
« 1 » |