Programové cviční - třída – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Programové cviční - třída – C / C++ – Fórum – Programujte.comProgramové cviční - třída – C / C++ – Fórum – Programujte.com

 

Mirek Braho0
Stálý člen
25. 6. 2007   #1
-
0
-

Ahoj lidi, tak jsem konečně dospěl ke třídám, a hned mam první problém. V knize Mistrovství v C++ byl příklad předělat strukturu a funkce které s ní operovaly do třídy. Tak jsem to jakž takž odladil až nakonec mi to hází jedinou chybu, ale zato nevím co s tím :(

Kód je následující:

#include <iostream>


using namespace std;

class golf
{
private:

char fullname[40];
int handicap;

public:

golf();
int setgolf();
void setgolf2(const char * name, int hc);
void handicap(int hd);
void showgolf();
~golf() {};
};

int main()
{
golf hraci, hraci2, hraci3;

hraci.setgolf;
hraci.showgolf;

hraci2.setgolf2("Jan Broft",10);
hraci2.showgolf();

hraci3.handicap(5);
hraci3.showgolf();

cout <<"\n\nAhoj!\n";
cout<<endl;
system("PAUSE");
return 0;
}

golf::golf()
{
strcpy(fullname,"Neznamy hrac");
handicap=0;
}

int golf::setgolf()
{

cout<<"Zadejte sve jmeno a golfovy handicap:\n";
cout<<"Jmeno: ";

if(!(cin.get(fullname, 40))) { return 0; }

cout<<"Handicap: ";
int h;
cin>>h;

handicap=h;
cout<<endl;
return 1;
}

void golf::setgolf2(const char * name, int hc)
{
strcpy(fullname,name);
handicap=hc;
}

void golf::handicap(int hd)
{
handicap=hd;
}

void golf::showgolf()
{
cout<<fullname<<endl;
cout<<handicap<<endl<<endl;
}

A chybu mi kompilátor hlásí tuto:

21 C:\DATA\C++\mistrovstvi-28.cpp declaration of `void golf::handicap(int)'
14 C:\DATA\C++\mistrovstvi-28.cpp conflicts with previous declaration `int golf::handicap'
C:\DATA\C++\mistrovstvi-28.cpp In function `int main()':
30 C:\DATA\C++\mistrovstvi-28.cpp statement cannot resolve address of overloaded function
31 C:\DATA\C++\mistrovstvi-28.cpp statement cannot resolve address of overloaded function


Obzvláště nerozumím těm posledním 2 řádkům co říká kompilátor "... address of overloaded function". Jo ta struktura předtím používala přetěžování funkcí, ale já to přepsal tak aby tam žádný přetížení nebylo, nebo ne? A taky nevim proc to hlásí že se tam tluče deklarace void golf::handicap(int) a int golf::handicap. Ta druhá deklarace v kódu přece není vůbec obsažena.

Díky za odpověď.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
25. 6. 2007   #2
-
0
-

Celé jsem to nezkoumal, ale nemůžeš mít stejný název členské proměnné stejný jako název metody. Je dobré dávat členským proměnným nějkaý prefix, např.:

 

....
char m_fullname[];
int m_handicap;
....

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
25. 6. 2007   #3
-
0
-

JO jo dik to bylo tim. Jinak ty 2 posledni radky ty chyby zpusobovalo to, ze sem zapomnel prazdne zavorky u volani clenske funkce hraci.setgolf() a hraci.showgolf(). Dík za pomoc.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
26. 6. 2007   #4
-
0
-

Lidicky opět potřebuju nakopnout. Sorry ze sem hazim tak dlouhe kody, ale u trid to jinak asi nejde. Celej ten kod je funkcni, ale potreboval bych poradit, jak udelat pole objektu. To bych celkem taky vedel, ale chci, aby kazdej ten objekt mel svoje data z ty struktury. Zkratka, aby se pri pridani noveho zakaznika zvetsilo to pole objektu o dalsi objekt s novejma datama novyho zakaznika. Nejak to nepobiram, zvladnul sem to jen s pevne stanovenou velikosti toho pole. Vim ze se to dela pres operator NEW, ale neumim to zkloubit s tou funkci na pridani. Diky za rady.

#include <iostream>


using namespace std;

struct customer
{
char fullname[35];
double payment;
};

class zakaznik
{
private:
int citac;
double platy;
customer zak;
public:
zakaznik();
void pridani(const char * jmeno, double n);
void zobrazeni();
void odebrani(int cislo);
~zakaznik() {};
};

int main()
{
int a;
char b[35];
double c;

zakaznik obchod[1];

while(a!=100)
{
cout<<"\n\n1)\tPridani uzivatele";
cout<<"\n2)\tOdebrani uzivatele";
cout<<"\n3)\tUkonceni programu";
cout<<"\n\nZadejte vasi volbu: ";

cin>>a;
switch(a)
{
case(1): cout<<"Zadejte jmeno a prijmeni zakaznika: ";
cin.get();
cin.get(b,35);
cout<<"Zadejte plat zakaznika: ";
cin>>c;
obchod[1].pridani(b,c);
obchod[1].zobrazeni();

break;

case(2):
break;

case(3): a=100;
break;

default: cout<<"Spatne zadani";
break;
}
}
cout <<"\n\nAhoj!\n";
cout<<endl;
system("PAUSE");
return 0;
}

zakaznik::zakaznik()
{
citac=0;
platy=0.0;
}

void zakaznik::pridani(const char * jmeno, double n)
{
citac++;
strcpy(zak.fullname, jmeno);
zak.payment=n;
}

void zakaznik::zobrazeni()
{
cout<<endl<<"Zakaznik #"<<1;
cout<<endl<<"Jmeno: "<<zak.fullname;
cout<<endl<<"Plat: "<<zak.payment;
}

void zakaznik::odebrani(int cislo)
{
}

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
26. 6. 2007   #5
-
0
-

To vollf82:

Mno, realokace pomocí new je docela pracná, takže bych dal přednost spíše vectoru z STL. Ale co se dá dělat(nezkoušeno,jen nastíním, jak by se to dalo dělat):



size_t size = 10, index= 0;
zakaznik *pole = new zakanik[size];
// nejake to pridavani, pozor max 10 prvku(viz. size)
pole[index++].pridani("Pepa Novak", 15000);
pole[index++].pridani("volf82", 150000); // solidni plat;)

// realokoace(buď použij realloc, nebo si to napis v C++)
zakaznik *pomocne = new zakaznik[size*2];
if(pomocne)
{ memcpy(pomocne, pole, sizeof(zakaznik)*index); // zkopirovat stare pole do noveho
delete [] pole; // smazat stare pole
pole = pomocne; // at stare pole ukazuje na nove
}

// a zase pridavani
pole[index++].pridani("Honza ", 100000);
//atd...

// smazat stare
delete [] pole;



A jak by to vypadalo s použitím STL:


vector<zakaznik> pole;
// plneni do doby nez Ti staci pamet
zakaznik z;
z.pridani("volf82", 10000);
pole.push_back(z); // musi se to tak blbe, protoze nemas pretizeny konstruktor



Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
27. 6. 2007   #6
-
0
-

Ještě mam jednu otázečku, hodilo by se to na to alokování většího pole. Jakou funkcí zjistím počet prvků v poli? Sizeof mi hodí velikost, kolik pole zabírá paměti (to se nedá použít ne?) a strlen zase funguje jen na typ char.

Myslím že sem o té funkci někde čet ale ted to nemůžu najít. Ď ...

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
27. 6. 2007   #7
-
0
-

To vollf82:

Tohle v C/C++ nezjistíš. Pokud alokuješ dynamicky, tak si někde musíš tu hodnotu pamatovat - v mém příkladě je to proměnná size, ale jak se tak dívám,tak jsem tam vynechal důležitou věc, takže teď už správně:



if(size == index) // pokud uz neni kam pridat
{
zakaznik *pomocne = new zakaznik[size*2];
if(pomocne)
{ memcpy(pomocne, pole, sizeof(zakaznik)*index); // zkopirovat stare pole do noveho
delete [] pole; // smazat stare pole
pole = pomocne; // at stare pole ukazuje na nove
size *= 2; // nova velikost pole
}
}


A ještě k tomu operátoru sizeof. Takhle můžeš zjistit počet prvků ve STATICKY alokovaném poli,př:


int pole[10];
cout << "Pocet prvku v poli je: " << sizeof(pole)/sizeof(pole[0]) << endl; // prvni sizeof vrati velikost celeho pole,
//tedy 10*sizeof(int) a druhy zjisti velikost prvni polozky pole. Kdyz tyto dve hdonoty navzajem vydelis,
// ziskas logicky pocet prvku v poli



Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
27. 6. 2007   #8
-
0
-

ááááááááááá ... já už z toho rostu, sakra. Ale zbývá už jen kousíček k úspěchu. Napsal jsem to takhle, první zákazník jde přidat i ho to zobrazí, ale při přidání druhého už to padne. Juro, prosím, vím že otravuju, ale nemoh bys tam odhalit tu chybku? Asi si nějak neumím představit jak tam fungujou ty ukazatele s tou deklarací nové paměti :(



int index=1, d=2;

int main()
{
int a;
char b[35];
double c;

zakaznik * obchod = new zakaznik[index];

while(a!=100)
{
cout<<"\n\n1)\tPridani uzivatele";
cout<<"\n2)\tOdebrani uzivatele";
cout<<"\n3)\tUkonceni programu";
cout<<"\n\nZadejte vasi volbu: ";

cin>>a;
switch(a)
{
case(1): cout<<"Zadejte jmeno a prijmeni zakaznika: ";
cin.get();
cin.get(b,35);
cout<<"Zadejte plat zakaznika: ";
cin>>c;

if(index==1)
{ obchod[0].pridani(b,c);
index++; d++; }
else if(index<d)
{
zakaznik * pomocne = new zakaznik[index];
for(int i=0; i<index; i++)
{
pomocne[i]=obchod[i];
pomocne[index].pridani(b,c);
delete [] obchod;
obchod=pomocne;
index++;
d++;
}
}
obchod[0].zobrazeni();

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
27. 6. 2007   #9
-
0
-

Tak v pohodě, už to mam. Triviální chyba :)

if(index<d)

{
zakaznik * pomocne = new zakaznik[d];
for(int i=0; i<index; i++)
{
pomocne[i]=obchod[i];
}
pomocne[index].pridani(b,c);
delete [] obchod;
obchod=pomocne;
index++;
d++;
}
for(int f=0; f<index; f++)
{
cout<<"\nZakaznik #"<<f+1;
obchod[f].zobrazeni();
}

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 21 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý