[ kragujevcanin @ 18.02.2009. 19:13 ] @
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]
[ Eurora3D Team @ 19.02.2009. 12:35 ] @
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]
[ kragujevcanin @ 19.02.2009. 20:46 ] @
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.
[ Eurora3D Team @ 20.02.2009. 01:38 ] @
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

[ kragujevcanin @ 20.02.2009. 02:43 ] @
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.
[ Eurora3D Team @ 20.02.2009. 09:41 ] @
Nista
Da , zaboravio sam }; ...
[ Nedeljko @ 20.02.2009. 10:56 ] @
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.
[ X Files @ 20.02.2009. 11:10 ] @
^
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.
[ kragujevcanin @ 20.02.2009. 18:50 ] @
Ne trazi svaki kompajler ; posle definicije klase.
[ X Files @ 20.02.2009. 19:36 ] @
^
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.
[ Dragi Tata @ 08.03.2009. 01:21 ] @
Svaki kompajler od CFronta pa naovamo zahteva ; posle deklaracije klase. Znate li bar jedan koji ne zahteva?

[ Dragi Tata @ 08.03.2009. 01:24 ] @
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?
[ 1jedini @ 08.03.2009. 10:42 ] @
Citat:
Dragi Tata: A zašto uopšte kreiraš f kao pointer na objekat na heapu?

To i mene zanima.