PDA

Prikaži potpunu verziju : pomoc, c++, apstraktne klase, visestruko nasledjivanje, pokazivaci


mikila
26.4.2013, 16:57
Pozdrav svima,
imam problem sa zadatkom koji ne znam koliko je za pocetnike, ali ja jesam pocetnik pa imam nekih nejasnoca i nemam rutinu, pa ovako. Ovde imam prilozen dropbox folder (https://www.dropbox.com/sh/olqrf7j5kd6pq4j/FHLJhZ3Ej0) sa dva fajla,
1. potraznja zadatka,
2. c++ fajl
ali da ne bih nagomilavao pusticu kod

Pitanja:
1.zadatak trazi da tipovi budu definisani kao string, ja sam stavio char, kako definisem string, ili ga koristim kao i char. malo mi nejasno.
2.zadatak trazi da se uradi u tri fajla, znaci klasa treba da bude "*.h" heder, ali ako stavim tako ne prepoznaje mi biblioteke "E:\Documents\Desktop\Simpozijum\1.h iostream: No such file or directory. " sta uraditi?
3.imam problem sa apstraktnom klasom i virtuelnom funkciom iz 29 linije, koja se odnosi i na 66 liniju ili je to tako dobro?
4. da li je 62 linija dobra (float P1, float P2)
bice ovde jos neko pitanje samo ako bude bilo kandidata za pomoc



#include <iostream>
#include <cstdlib>

using namespace std;

class kSimpozijum
{
private:
//float pKotizacija;

public:
float pKotizacija; //pKotizacija - visina kotizacije |float|, privatni atribut
float tPrevoz;
float tSmestaj;
char pNaziv; // pNaziv - naziv simpozijuma |string|. javni atribut
char pMesto; //pMesto - naziv mesta gde se simpozijum odrzava |string|, javni atribut

kSimpozijum() //Konstruktor - koji upisuje vrednosti koje korisnik unese u atribute.
{
cout<<"\nUnesi naziv Simpozijuma: "; cin>>pNaziv;
cout<<"\nUnesi naziv grada gde se simpozijum odrzava: "; cin>>pMesto;
cout<<"\nUnesi visinu kotizacije: "; cin>>pKotizacija;
}
void fIspis() //funkcija koja ispisuje atribute na ekran(ne prima parametre, ne vraca rezultat)
{
cout<<"\nOvo je Simpozijum "<<pNaziv<<", a odrzava se u "<<pMesto<<"."<<endl;
};
float fDohvatiKot() {return pKotizacija;}
//- fDohvatiKot - funkcija koja vraca vrednost atributa pKotizacija (ne prima parametre, ne vraca rezultat)
virtual float fUcesce( float pKotizacija, float tPrevoz, float tSmestaj)
{return tPrevoz + tSmestaj;}
// fUcesce - cista virtualna funkcija koja izracunava cenu ucesca na simpozijumu, sa troskovima smestaja
// i prevoza, pri cemu se vrednost za troskove smestaja i prevoza prima iz glavnog programa (prima 2 parametra i vraca rezultat)
~kSimpozijum(){} //destruktor
};
class kUcesnik //Kreira klasu kUcesnik
{
public: //javni atributi
char pIme; //- pIme - ime i prezime ucesnika u simpozijumu |string|,
char pUstanova; //- pUstanova - naziv ustanove u kojoj je ucesnik zaposlen |string|

//javne metode
kUcesnik() //- Konstruktor - koji upisuje vrednosti koje korisnik unese u atribute
{
cout<<"\nUnesi Ime i prezime ucesnika simpozijuma: "; cin>>pIme;
cout<<"\nUnesi naziv ustanove u kojoj je ucesnik zaposlen: "; cin>>pUstanova;
}
void fPisiUcesnika() //- fPisiUcesnika - funkcija koja ispisuje vrednosti atributa na ekran
//(ne prima parametre, ne vraca rezultat)
{
cout<<"\nUcesnik simpozijuma "<<pIme<<", je iz ustanove"<<pUstanova<<".";
};
~kUcesnik(){} // destruktor
};

class iStrucniRad:public kSimpozijum, public kUcesnik // Kreira klasu iStrucniRad koja nasledjuje klasu kSimpozijum i kUcesnik
{
public:
char pNazRada; //- pNazRada - naziv rada |string|
int pBrAutora; //- pBrAutora - broj autora knjige |int|
int pPovez; //- pPovez - tip poveza (1- tvrdi povez, 2- meki povez) |int|

//Konstruktor - upisuje vrednosti koje korisnik unese u atribute i nadogradjuje konstruktore klasa kSimpozijum i kUcesnik
iStrucniRad():kSimpozijum(), kUcesnik()
{
cout<<"\nUnesi naziv rada: "; cin>>pNazRada;
cout<<"\nUnesi broj autora: "; cin>>pBrAutora;
cout<<"\nUnesi tip poveza(1-tvrdi, 2-meki): "; cin>>pPovez;
}
void fIspis(float P1, float P2)
//- fIspis - funkcija koja ispituje vrednosti atributa na ekran i poziva funkcije
// - fPisiUcesnika klase kUcesnik
// - fIspis i fUcesce klase kSimpozijum
// (prima 2 parametra, ne vraca rezultat)
{
kUcesnik::fPisiUcesnika();
kSimpozijum::fIspis();
kSimpozijum::fUcesce( pKotizacija, tPrevoz, tSmestaj);

cout<<"\nNaziv rada je "<<pNazRada<<", broj autora je "<<pBrAutora<<", a tip poveza je "<<pPovez<<"."<<endl;
}
virtual float fUcesce()
// fUcesce - cista virtualna funkcija koja izracunava cenu ucesca na simpozijumu, sa troskovima smestaja
// i prevoza, pri cemu se vrednost za troskove smestaja i prevoza prima iz glavnog program
{
float cu=0;

if (pBrAutora<3)
{
cu+=(pKotizacija+tPrevoz+tSmestaj)*pBrAutora;
return cu;
}
else
{
cu+=(0.7*pKotizacija+tPrevoz+tSmestaj)*pBrAutora;
return cu;
}
}
~iStrucniRad(){
}
};

Lucic Nemanja
27.4.2013, 3:44
Ko li je ovaj zadatak sastavljao da mi je znati...
Elem, string tip u c++-u ne postoji. Moraš da ga realizuješ preko niza charova. Da li ćeš to raditi statički ili dinamički je na tebi ili postavci zadatka. Ako si upoznat sa time kako funkionišu nizovi onda ćeš se snaći lako i sa stringovima (pošto oni je l' te i nisu ništa drugo do obični nizovi). Ako nisi, onda baci prvo pogled na njih :).
Dakle string je niz charova. Kraj stringa u tom nizu obeležavaš terminalnim simbolom '\0'.
Kako bi manipulisao tim stringovima koristićeš zaglavlje string.h koje naravno moraš uvesti pretprocesorskom naredbom #include <string.h>. Tu imaš brdo funkcija: za upoređivanje stringova, kopiranje, nadovezivanje itd...
Primer upotrebe stringa:

char str[50]; //za sad samo parče memorije od 50 bajtova (veličina chara je bajt)
str[0] = 'a';
str[1] = 'b'; //sada imaš nešto malo bliže stringu, ali kompajler i dalje ne zna gde mu je kraj. Probaj da ga ispišeš i videćeš da će ti ispisati nešto tipa abxxxxxxxxxxxxx (x može biti bilo šta)
str[2] = '\0'; // e sad već imaš potpuno definisan string.

char str2[30] = "Neki string"; // pri inicijalizaciji kompajler će sam staviti terminalnu nulu na kraj ovog niza karaktera

strcpy(str, str2); //u str kopira str2 sve do terminalne nule uključujući i nju naravno


Pazi na tu terminalnu nulu početnici uvek prave greške kod toga!!! Bez nje idejno nemaš string nego običan niz charova kome ne znaš gde je kraj. Naravno ne možeš upisati string od 100 karaktera u str jer smo ga ograničili na 50. Tehnički maksimalni string koji mu možeš proslediti je od 49 karaktera jer poslednja mora biti terminalna nula (opet terminalna nula). Prosto ne mogu da naglasim dovoljno koliko je bitna :D!
I ne zaboravi da uvezeš string.h ako koristiš ove funkcije tipa strcpy.

Stringove, naravno, možeš alocirati i dinamički.


char *str;

str = new char[50];
str = "neki string";


Što se drugog pitanja tiče, jesi li siguran da si napravio taj fajl uopšte? U kom okruženju pišeš?

Treće pitanje... ovde više stvari nije dobro.
Lepo ti je u zadatku rečeno da treba da ima dva parametra, a ti si stavio tri.
Drugo, rečeno ti je da metoda treba da bude čisto virtuelna. Čisto virtualne metode su indikatori da je klasa apstraktna i praviš ih tako što napišeš =0 pored liste argumenata. Kad je klasa apstraktne ne možeš je instancirati (konstruisati objekte njenog tipa). Ovde sam sad malo zbunjen tekstom jer je rečeno da treba da bude čisto virtuelna i u nasleđenoj klasi, što mi zaista nema smisla. U svakom slučaju kapiram da se od tebe očekuje da pregaziš metodu iz osnovne klase, tako da bi trebalo fUcesce da ima isti potpis kao i ona iz osnovne klase, a ovde se tebi razlikuju. Apelujem da dobro naučiš nasleđivanje i polimorfizam, ovde su krucijalni.

Četvrto pitanje... nije dobra. Nemaš nikakvu potrebu da prosleđuješ bilo kakve argumente.

Još stvari koje ti ne valjaju:
tPrevoz i tSmestaj ne treba da kreiraš kao argumente klase. Sve što treba da uradiš je da ih postaviš kao parametre u metodi fUcesce.
Ovaj ispis u iStrucniRad mi nikako nije jasan. Nemaš nikakve potrebe da pozivaš sve ove metode. Samo pozoveš ispis od osnovne klase i to je dovoljno.
Ne treba u konstruktoru da učitavaš atribute sa glavnog ulaza nego kroz argumente kao što je rečeno u zadatku.

Gledajući sve ovo vidim da i ne kapiraš baš najbolje šta radiš i šta pišeš. Moja preporuka ti je da naučiš sledeće oblasti i tim redosledom:
1) nizovi
2) stringovi
3) klase i objekti
4) nasleđivanje
5) polimorfizam


Izmenjen kod (https://www.dropbox.com/s/vd45p84pi717zjg/kod.h) (verovatno ti neće mnogo pomoći dok ne naučiš ovo što sam ti reko, ali baci pogled jednom kad savladaš to).

I ovaj konstruktor u iStrucniRad što sam napisao mi je sumnjiv nešto. Mnogo mi to argumenata :icon_scra. Možda je hteo da napraviš neki konstruktor kopije, pa samo da proslediš objekte. Nemam pojma, baš je ružno zadatak napisan.
Ako sam negde napravio grešku, neka me neko ispravi :).

MG-RAY
27.4.2013, 10:36
String kao ugradjeni tip ne postoji u C, a u C++ je to std::string (http://www.cplusplus.com/reference/string/string/).

voodoo_
27.4.2013, 12:54
Tehnički, std::string je deo prateće biblioteke a ne jezika, ali da, ako se već piše pravi C++ program a ne C program sa klasama, normalno je koristiti std klase.

mikila
27.4.2013, 16:24
Što se drugog pitanja tiče, jesi li siguran da si napravio taj fajl uopšte? U kom okruženju pišeš?

dev-c++ post-4.9.9.2 Bloodshed verzija 5.3.0.4.
I ovaj fajl koji si uradio "kod.h" kod mene prijavljuje isto, iostream.h pravi problem, obrisao sam ".h" proso je to, ali ima mnogo nekih drugih gresaka, mozda je problem kod mene.

zbunjenost mi jaca strana :( . ako vas buni, meni ...
proci cu ponovo te stvari, vidim da mi ne ide bas najbolje.
hvalja ljudi.

dodato...


Izmenjen kod (https://www.dropbox.com/s/vd45p84pi717zjg/kod.h) (verovatno ti neće mnogo pomoći dok ne naučiš ovo što sam ti reko, ali baci pogled jednom kad savladaš to).

evo obrisao ".h" u <iostream> i ispravio par sintaksnih gresaka (nadam se da tako treba), ostaje mi samo greska sa cistom virtualnom funkcijom jer ona ne sme imati parametre, pa mi sad to nije jasno, buni me malo tekst zadatka, mozda je to tako namerno i napisano da me zbuni,....o.O :boodala:

Izmenjen kod, (https://www.dropbox.com/s/nyd77ve2ean3b3f/simpozijum.cpp) koji si poslao. Sto se tice toga da mora biti u 3 fajla, to cu izuzeti, tako da ce sve biti u jednom.
-i dalje imam problem sa cistom virtuelnom funkcijom, kad oslobodim kodove iz komentara, pravi mi gresku, ne znam bas kako da definisem deklarisem

Lucic Nemanja
29.4.2013, 12:58
Tehnički, std::string je deo prateće biblioteke a ne jezika, ali da, ako se već piše pravi C++ program a ne C program sa klasama, normalno je koristiti std klase.

Verovatno im nije dozvoljeno da ih koriste. Nama na faksu nisu davali dok smo učili c++ da se koristimo standardnom bibliotekom.

dev-c++ post-4.9.9.2 Bloodshed verzija 5.3.0.4.
I ovaj fajl koji si uradio "kod.h" kod mene prijavljuje isto, iostream.h pravi problem, obrisao sam ".h" proso je to, ali ima mnogo nekih drugih gresaka, mozda je problem kod mene.

zbunjenost mi jaca strana :( . ako vas buni, meni ...
proci cu ponovo te stvari, vidim da mi ne ide bas najbolje.
hvalja ljudi.

dodato...



evo obrisao ".h" u <iostream> i ispravio par sintaksnih gresaka (nadam se da tako treba), ostaje mi samo greska sa cistom virtualnom funkcijom jer ona ne sme imati parametre, pa mi sad to nije jasno, buni me malo tekst zadatka, mozda je to tako namerno i napisano da me zbuni,....o.O :boodala:

Izmenjen kod, (https://www.dropbox.com/s/nyd77ve2ean3b3f/simpozijum.cpp) koji si poslao. Sto se tice toga da mora biti u 3 fajla, to cu izuzeti, tako da ce sve biti u jednom.
-i dalje imam problem sa cistom virtuelnom funkcijom, kad oslobodim kodove iz komentara, pravi mi gresku, ne znam bas kako da definisem deklarisem

Ne znam na koji fazon mi ga je sačuvao kao .h file... Treba .cpp da bude :). Imaš grešku zbog ";". Ako oslobodiš definiciju metode iz komentara moraš da izbrišeš ";".

Teva
30.4.2013, 8:45
Šta ćemu strcpy? std::string bi trebao da ima ugrađen operator dodele i kopi konstruktor.

A što se tiče .h. U c++ biblioteke (bar ove standardne) se pišu bez .h, dok ako ti trebaju C biblioteke pišeš samo c ispred (stdlib.h => cstdlib)..

Što se tiče čisto virtuelne funkcije/metode, ona je čisto virtuelna SAMO u baznoj klasi. U klasama koje nasledjuju baznu klasu, metoda ima isti potpis i ima telo a msm da ne bi trebala ni virtual da ima (u dete klasi)

Lucic Nemanja
2.5.2013, 15:29
Šta ćemu strcpy? std::string bi trebao da ima ugrađen operator dodele i kopi konstruktor.

A što se tiče .h. U c++ biblioteke (bar ove standardne) se pišu bez .h, dok ako ti trebaju C biblioteke pišeš samo c ispred (stdlib.h => cstdlib)..

Što se tiče čisto virtuelne funkcije/metode, ona je čisto virtuelna SAMO u baznoj klasi. U klasama koje nasledjuju baznu klasu, metoda ima isti potpis i ima telo a msm da ne bi trebala ni virtual da ima (u dete klasi)

Slažem se da je bolje koristiti std, ali na većini mesta gde se uči c++ nije dozvoljeno njeno korišćenje. Meni npr. na etf-u nije bilo dozvoljeno. Možda ovde, gde god to bilo jeste. Ne znam, pa za svaki slučaj napisah bez std.

Teva
3.5.2013, 14:20
Meni je to glupo.. Učiš c++ a ne smeš da koristiš stl... Nas su terali radi vežbe da implementiramo liste, vektore itd, al što se tiče zadataka, radiš sa čim god znaš... xD

Lucic Nemanja
3.5.2013, 15:06
Pa kad naučiš osnovne koncepte lako je iskoristiti stl. To im je neka filozofija.