Problem s reprezentaci stringu jako pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problem s reprezentaci stringu jako pole – C / C++ – Fórum – Programujte.comProblem s reprezentaci stringu jako pole – C / C++ – Fórum – Programujte.com

 

klinki0
Návštěvník
19. 4. 2008   #1
-
0
-

Zdravim mam tenhle kod:



class trida
{
private:
string nazev;
public:
trida(const char * nazev);
trida(string nazev);
string getNazev() const {return nazev;};
};

trida::trida(const char * n):
nazev(n)
{};

trida::trida(string n):
nazev(n)
{};

class nadTrida : public trida
{
public:
static unsigned short int pocet;
nadTrida();
string getNazev() const {return trida::getNazev();};
};
static unsigned short int nadTrida::pocet = 0;
nadTrida::nadTrida():
trida({'P', 'O','L', 'O', 'Z', 'K', 'A', ' ', nadTrida::pocet, '\0'})
{pocet++;}


A mam par problemu:
1) nefunguje mi inicializator trida({'P', 'O','L', 'O', 'Z', 'K', 'A', ' ', nadTrida::pocet, '\0'})
(napadlo me jeste udelat tohle:
trida({'P', 'O','L', 'O', 'Z', 'K', 'A', ' ', (char)nadTrida::pocet, '\0'})
ale pise stejne chyby..


pise to tyhle chyby:


Error 1 error C2143: syntax error : missing ')' before '{' c:\documents and settings\david\dokumenty\visual studio 2008\projects\soucastky\soucastky\main.cpp 47 Soucastky
Error 2 error C2512: 'trida' : no appropriate default constructor available c:\documents and settings\david\dokumenty\visual studio 2008\projects\soucastky\soucastky\main.cpp 47 Soucastky
Error 3 error C2143: syntax error : missing ';' before '}' c:\documents and settings\david\dokumenty\visual studio 2008\projects\soucastky\soucastky\main.cpp 47 Soucastky
Error 4 error C2059: syntax error : ')' c:\documents and settings\david\dokumenty\visual studio 2008\projects\soucastky\soucastky\main.cpp 47 Soucastky
Error 5 error C2447: '{' : missing function header (old-style formal list?) c:\documents and settings\david\dokumenty\visual studio 2008\projects\soucastky\soucastky\main.cpp 48 Soucastky


Jak jinak mam tedy vyvolat konstruktor s retezcem ve kterem bude
"POLOZKA 1" - tedy za predpokladu ze existuje pouze 1 instance tridy.. atd.
Takze by to vypadalo takto:
nadTrida a;
a.getNazev() by vratila "POLOZKA 1"
nadTrida b;
b.getNazev() by vratila "POLOZKA 2"
atd...

Napadlo me napriklad scitani stringu, ale trida string nema konstruktor prijimajici parametr unsigned short atd....

Edit:
Ted sem si vzpomnel ze kdyz pretypuju promennou int na char tak stejne nedostanu znak toho cisla ktere potrebuju (char '1' != char 1)
Takze je to jeste horsi situace :'(

Nahlásit jako SPAM
IP: 85.13.98.–
Matrix17
~ Anonymní uživatel
300 příspěvků
20. 4. 2008   #2
-
0
-

To klinki : Řešením je použít bezparametrický konstruktor a následně přiřadit stringu nazev hodnotu kterou chceš.
Příklad:



nadTrida::nadTrida()
{
nazev = "POLOZKA ";
switch (pocet) {
case 1: nazev += '1';
break;
atd.
}
}


Mimo to ty středníky za těma složenejma závorkama u metod tý třídy tam bejt nemusí.
Přičemž tyhle řádky se mi taky zdaj divný:


static unsigned short int nadTrida::pocet = 0; //hlavně tenhle
nadTrida::nadTrida():
trida({'P', 'O','L', 'O', 'Z', 'K', 'A', ' ', nadTrida::pocet, '\0'})
{pocet++;}

Nahlásit jako SPAM
IP: 85.207.17.–
klinki0
Návštěvník
20. 4. 2008   #3
-
0
-

Jedinej "divnej" radek je tento:
trida({'P', 'O','L', 'O', 'Z', 'K', 'A', ' ', nadTrida::pocet, '\0'}) a to je pokus o inicializator ale myslim ze uz sem to psal ze mi nakonec doslo ze je to uplne blbe...

Btw to tvoje reseni se mi nelibi... Co kdyz budu mit treba 9000 instanci ty tridy? to budu psat 9000x case ? Nebo nejak slozite to cislo delit tak, abych dostal cislici jednotliveho mista?

Jinak diky aspon za snahu ;)

Nahlásit jako SPAM
IP: 85.13.98.–
Matrix17
~ Anonymní uživatel
300 příspěvků
20. 4. 2008   #4
-
0
-

To klinki : Zřejmě si nepochopil pointu toho řešení. Spočívá v tom že by sis převedl číslo na znak a následně ho přidal do pole. Čili jen jeden cyklus ve kterým bys dělil deseti a výsledný číslo převedl na znak kterej by se uložil do pole. Nahoře sem to skrouhnul až moc.

Nahlásit jako SPAM
IP: 85.207.17.–
klinki0
Návštěvník
20. 4. 2008   #5
-
0
-

Uz tu funkci mam :)
Btw pointu sem pochopil viz:


Btw to tvoje reseni se mi nelibi... Co kdyz budu mit treba 9000 instanci ty tridy? to budu psat 9000x case ?
Nebo nejak slozite to cislo delit tak, abych dostal cislici jednotliveho mista?


Jen se mi do toho nejak nechtelo O:-)


string prevedCislo(int cislo)
{
int naZnak;
string stringcislo;

for (int x = 9, mocnina = (double)pow((double)10, 9); x >=0; x--, mocnina = (double)pow((double)10, x))
{
naZnak = cislo / mocnina;
cislo -= naZnak * mocnina;
switch(naZnak)
{
case 0:
if (stringcislo.length() != 0)
stringcislo += '0';
break;

case 1:
stringcislo += '1';
break;

case 2:
stringcislo += '2';
break;

case 3:
stringcislo += '3';
break;

case 4:
stringcislo += '4';
break;

case 5:
stringcislo += '5';
break;

case 6:
stringcislo += '6';
break;

case 7:
stringcislo += '7';
break;

case 8:
stringcislo += '8';
break;

case 9:
stringcislo += '9';
break;
}
}
return stringcislo;
};

Nahlásit jako SPAM
IP: 85.13.98.–
AdamHlavatovic0
Stálý člen
21. 4. 2008   #6
-
0
-

Pokiaľ ten kus kódu má realizovať prevod kladného celého čísla na reťazec, tak je to presne spôsob akým sa to nemá robiť. Pre inšpiráciu uvádzam ukážku, ako by to mohlo vypadať:

string num2str(unsigned int num, short rad)

{
string str;
str.reserve(10);

while (num > 0)
{
str.insert(str.begin(), char((num % rad) + '0'));
num = num / rad;
}

return str;
}

Nahlásit jako SPAM
IP: 217.73.16.–
klinki0
Návštěvník
21. 4. 2008   #7
-
0
-

Wow ja ziram :) Tohle reseni me fakt nenapadlo ale dost velkej hukot je, ze to funguje i pro binarni (a vpodstate i hexdecimalni akorat tady jsou jine znaky nez A B C D E F) soustavu :O
(sice sem to zatim nepotreboval ale tohle se bude hodit vzdycky :)) )
Diky moc :-)

Nahlásit jako SPAM
IP: 85.13.98.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
24. 4. 2008   #8
-
0
-

ehm... neni lepsi, nez se rucne pachtit s prevodem, pouzit radsi sprintf(), nebo jeste lip atoi()? :-)

Nahlásit jako SPAM
IP: 62.245.124.–
klinki0
Návštěvník
27. 4. 2008   #9
-
0
-

atoi() funguje přesně naopak - převede řetězec na číslo. sprintf() zase vyžaduje jako parametr adresu řetězce do kterého se ta hodnota uloží, což je v daném případě nepoužitelné (jedná se o dočasnou proměnnou)
Navíc nikdy bych nedosáhl tak krásného zápisu do inicializátoru, jako je trida(string("Polozka ") + num2string(159))
Podle mého názoru je tento kód velice čitelný, kdybych chtěl použít něco jako je ten sprintf() apod. musel bych do toho přimíchat ještě funkci která mi do toho řetězce na konec zkopíruje to číslo převedené na řetězec (navíc by se to docela težko řešilo s pamětí protože nevím přesně jak velké bude číslo -> nevím jak velký bude řetězec)

Samozřejmě v některých případech bude jistě lepší využít sprintf() apod. ale v tomto jistě ne.

Opravte mne pokud se mýlím, v C++ jsem zatím začátečník :)

Nahlásit jako SPAM
IP: 85.13.98.–
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, 65 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ý