Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa Konstruktorom.

[es] :: C/C++ programiranje :: Problem sa Konstruktorom.

[ Pregleda: 2742 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

kragujevcanin
Nenad Sredojevic
kragujevac

Član broj: 26524
Poruke: 66
85.222.179.*



Profil

icon Problem sa Konstruktorom.18.02.2009. u 19:13 - pre 183 meseci
Koristim Visual C++ v6.0, kada deklarisem konstruktor..
file::file (const char *ime_dat, const char *mod)
javlja mi gresku kako konstruktor ne moze imati povratnu vrednost.
Pitanje: Kako se definisu konstruktori kod ovog programa?

Znaci, konkretno ovaj primer nije bitan, svaki konstruktor sa klasa::klasa () prijavljuje gresku (u drugim kompajlerima nije). Jednostavno, kako se definise konstruktor u VC++ 6.0?

[Ovu poruku je menjao kragujevcanin dana 19.02.2009. u 02:37 GMT+1]
to be continued...
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.kbcnet.co.yu.



+7 Profil

icon Re: Problem sa Konstruktorom.19.02.2009. u 12:35 - pre 183 meseci
Pa bez povratne vrednosti
Evo sastavio sam malu klasu kao primer.
Ima svega po malo , jedino nisam stigao da napisem komentare koda.
Namerno je koriscen stdio
i kompajluje se (u VC++6) sa 0 error(s), 0 warning(s)
Code:

#include <stdio.h>

class file
{
public:
    file();                         // prvi konstruktor
    file(char*);               // drugi konstruktor
    file (const char *, const char *); // tvoj konstruktor
    ~file();                      // destruktor
    bool open(char*);     // open funkcija
    char* operator<<(int&);   // operator za citanje, npr. ovaj << 

private:
    FILE* f;         // fajl pointer
    char* buffer; // char pointer , ovo ce da nam bude buffer == memorija u koju upisujemo i iz koje citamo
};

file::file():f(0),buffer(0) // konstruktor , nema povratnu vrednost , nije npr. void file::flie() i nema return
{
}

file::file(char* name):f(0),buffer(0) // f(0),buffer(0) ovo znaci f = 0; buffer = 0;
{
    if(name) // proveravamo pointer 
        f = fopen(name,"r");   // fopen funkcija za otvaranje fajla , mod r == read w  == write ...
}

file::file (const char *ime_dat, const char *mod) :f(0),buffer(0) // tvoj konstruktor
{
    if(ime_dat && mod)
         f = fopen(ime_dat,mod);
}

bool file::open(char* name)  // fn open
{    
    if(f)                 // ako je neki fajl otvoren 
        fclose(f);     // zatvaramo ga
    f = 0;
    if(name)
       f = fopen(name,"r");  // i pokusavamo da otvorimo ovaj novi
    if(!f)
        return false;
    return true;
}

file::~file()  // destruktor
{
    if(f)
        fclose(f);   // zatvaramo fajl ako je otvoren
    if(buffer)
        delete[] buffer;  // oslobadjamo memoriju ako je zauzeta
}

char* file::operator<<(int &ln)   // operator za citanje , ova fn je mogla da se zove bilo kako ...
{
    if(buffer)
        delete[] buffer; // oslobadjamo memoriju ako smo je ranije rezervisali ...
    buffer = 0; // oznacicemo da ovaj pointer nije iskoriscen

    if(ln < 1 || !f)
    {
        ln = 0;
        return buffer;
    }
    
    buffer = new char[ln+1]; // alociramo memoriju , za jedan bajt vecu zato sto cu kad citam tekst da stavim nulu na kraju
    if(!buffer)
        return buffer;
    ln = fread(buffer,sizeof(char),ln,f); // funkcija za citanje , parametri : lokacija , merne jedinica , koliko da procita i fajl pointer
    return buffer; // vracamo pokazivac na podatke, ova klasa se brine o potrebnoj memoriji , spolja vracamo samo pointer
}

int main()
{
    char * txt; int ln = 10;
    file* f = new file("C:\\txt.txt","rb");
    if(f)
    {
        do{
            txt = f->operator <<(ln); // citamo po 10 bajtova // ln je preneto po referenci i bice menjano u funkciji
            if(ln){   // ovo obavezno proveriti , kad nista nije procitano ln je nula i vracen je null pointer
               txt[ln] = 0; // kad radimo sa tekstom trebamo da obelezimo kraj teksta nulom
               printf(txt); //  ispisujemo
            }
        }while(ln > 0);  // ln ce biti nula kad dodjemo do kraja fajla
        delete f;
    }
    return 0;
}


[Ovu poruku je menjao Eurora3D Team dana 20.02.2009. u 03:30 GMT+1]
 
Odgovor na temu

kragujevcanin
Nenad Sredojevic
kragujevac

Član broj: 26524
Poruke: 66
*.adsl.verat.net.



Profil

icon Re: Problem sa Konstruktorom.19.02.2009. u 20:46 - pre 183 meseci
Hvala ali i dalje mi nije jasno zasto moj konstruktor ne radi. Nisam pocetnik u cpp ali mi ni najmanje nije jasan smisao tvog koda.
Hvala jos jednom, snaci cu se.
to be continued...
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.kbcnet.co.yu.



+7 Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 01:38 - pre 183 meseci
Kako mislis nije ti jasan smisao ?
Klasa koja moze da otvori fajl , procita podatke i zatvori fajl. Koristio sam tri standardne C funkcije ... ostalo je cist C++ , imamo i printf funkciju.
Drugim recima pokusao sam da pretpostavim sta radis pa sam napravio klasu
Dodao sam i komentare u kod ... pogledaj ponovo.
Inace u VC++6 konstruktori se deklarisu kao i svakom dugom kompajleru i ne smeju da vracaju vrednost.
Ovu gresku koju si naveo (error C2533) javlja kad uradis npr. void file::file(){} a kad stavis return nesto; u kontruktor funkciji dobijas error C2534


 
Odgovor na temu

kragujevcanin
Nenad Sredojevic
kragujevac

Član broj: 26524
Poruke: 66
*.adsl.verat.net.



Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 02:43 - pre 183 meseci
Hvala ti puno, greska je u tome sto vc++ trazi da se po deklaraciji klase napise "};" a ne samo } a to nisam navikao kod starijih komplajlera. Smesno.
Svaka cast na detaljnosti kod komentara!
Hvala jos jednom.
to be continued...
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.kbcnet.co.yu.



+7 Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 09:41 - pre 183 meseci
Nista
Da , zaboravio sam }; ...
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2789 Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 10:56 - pre 183 meseci
Citat:
kragujevcanin: Hvala ti puno, greska je u tome sto vc++ trazi da se po deklaraciji klase napise "};" a ne samo } a to nisam navikao kod starijih komplajlera.


To zahteva C++ standard, ali su starije verzije MS-ovih kompajlera to tolerisale.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 11:10 - pre 183 meseci
^
Tacka zarez je obavezna jer C/C++ sintaksa/semantika za strukture/klase dozvoljava direktno kreiranje objekata/pokazivaca/referenci iza } a ispred ;.

Nestavljanje ; iza } zna da proizvede spektakularne poruke o greskama i to cesto u nekom drugom (narednom) fajlu u projektu, jer se cesto defnicije klasa nalaze na kraju fajla, a kompajer nastavak trazi u narednom fajlu. To je jedna od vrlo cestih greska koje pocetnici prave, za sta je dokaz i ovaj thread.
 
Odgovor na temu

kragujevcanin
Nenad Sredojevic
kragujevac

Član broj: 26524
Poruke: 66
*.adsl.verat.net.



Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 18:50 - pre 183 meseci
Ne trazi svaki kompajler ; posle definicije klase.
to be continued...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Problem sa Konstruktorom.20.02.2009. u 19:36 - pre 183 meseci
^
Ne sumnjam da ne trazi svaki kmpajler ; iza definicije klase, ali je svakako korisno drzati se standarda i razumeti razloge za neke pojave.

Slucaj koji si opisao je relativno čest a dobro je da si sam ustanovio gde je problem.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Problem sa Konstruktorom.08.03.2009. u 01:21 - pre 183 meseci
Svaki kompajler od CFronta pa naovamo zahteva ; posle deklaracije klase. Znate li bar jedan koji ne zahteva?


 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Problem sa Konstruktorom.08.03.2009. u 01:24 - pre 183 meseci
Citat:
Eurora3D Team
Code:

int main()
{
    char * txt; int ln = 10;
    file* f = new file("C:\\txt.txt","rb");
    if(f)
    {
        do{
            txt = f->operator <<(ln); // citamo po 10 bajtova // ln je preneto po referenci i bice menjano u funkciji
            if(ln){   // ovo obavezno proveriti , kad nista nije procitano ln je nula i vracen je null pointer
               txt[ln] = 0; // kad radimo sa tekstom trebamo da obelezimo kraj teksta nulom
               printf(txt); //  ispisujemo
            }
        }while(ln > 0);  // ln ce biti nula kad dodjemo do kraja fajla
        delete f;
    }
    return 0;
}



A zašto uopšte kreiraš f kao pointer na objekat na heapu?
 
Odgovor na temu

1jedini
Dejan Milosavljevic
BG

Član broj: 102721
Poruke: 74
92.244.144.*



Profil

icon Re: Problem sa Konstruktorom.08.03.2009. u 10:42 - pre 183 meseci
Citat:
Dragi Tata: A zašto uopšte kreiraš f kao pointer na objekat na heapu?

To i mene zanima.
AKA DDMM
 
Odgovor na temu

[es] :: C/C++ programiranje :: Problem sa Konstruktorom.

[ Pregleda: 2742 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.