Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Klasy, C++] Prośba o sprwdzenie kodu źródłowego

Ostatnio zmodyfikowano 2010-08-07 20:17
Autor Wiadomość
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:
C/C++
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() { };
};

C/C++
funkcje.cpp:
#include "klasy.h"
float otoczenie::pobierztlen()
{
    return tlenatmosfera =( tlen * 0.6 );
};
float woda::pobierztlenodotoczenia()
{
    return tleniwoda =( tlenatmosfera / 2 );
};

C/C++
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.
P-20573
kamillo121
» 2010-08-07 19:18:19
Klasy bazowe powinny mieć wirtualny destruktor.


C/C++
class Base
{
public:
    virtual ~Base();
};

class TraTa
    : Base
{
public:
    ~TraTa();
};


//drugi przypadek

class BaseF
{
public:
    virtual ~BaseF();
};


class BaseN
    : BaseF
{
public:
    virtual ~BaseN();
};

class TraTa
    : BaseN
{
public:
    ~TraTa();
};
P-20576
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.
P-20578
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:

C/C++
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

C/C++
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 :)
P-20579
huberthx
Temat założony przez niniejszego użytkownika
» 2010-08-07 19:44:22
Dziękuję za pomoc.
P-20580
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.
P-20581
Elaine
» 2010-08-07 20:11:47
Administratorom? Czemu w liczbie mnogiej, skoro jest tylko jeden?
P-20582
lenrokskate
» 2010-08-07 20:17:06
to był chyba skrót myślowy - pewnie mu chodziło o moderatorów :D
P-20583
« 1 »
  Strona 1 z 1