Spojení string – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spojení string – C / C++ – Fórum – Programujte.comSpojení string – C / C++ – Fórum – Programujte.com

 

vollf820
Stálý člen
10. 8. 2007   #1
-
0
-

Ach jo, dost mě štve, že sem pořád píšu takový prkotiny a neumím se s tím vypořádat, ale prostě to nejde :(

Mám následující problém. Zkrátka potřebuju ve třídě přetížit operátor sčítání pro řetězce. Tak jsem to zkusil nějak takhle:

class String

{
private:
char * str;
int len;
public:
String(const char * s);
String();
String(const String & st);
~String();
int lenght() const { return len; }
// přetížené operátory
String & operator=(const String & st); // operátor přiřazení
String & operator=(const char * s); // operátor přiřazení č. 2

// spřátelené funkce
friend bool operator>(const String &st1, const String &st2);
friend bool operator<(const String &st, const String &st2);
friend bool operator==(const String &st, const String &st2);
friend ostream & operator<<(ostream & os, const String & st);
friend istream & operator>>(istream & is, String & st);
friend String & operator+(const String & t1, const String t2);
};


String & operator+(const String & t1, const String t2)

{
String temp;
temp.len = strlen(t1.str) + strlen(t2.str);
temp.str = new char[temp.len+1];
temp.str = strcat(t1.str , t2.str);

return temp;

}


Zkoušel sem i strcpy(temp.str, strcat(t1.str, t2.str); ale taky nejde.

Funkce je jako friendly. Ovšem kdyz pak udělam objekty String A String B a pak dam cout<<A + B; tak se to nějak sekne a nic to nevypíše. Slouží vůbec funkce strcat() na spojení stringu? Někde sem si přečet že jo.

Díky za objasnění problému.

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

Zdravím,

z toho, že ti něco nefunguje si nedělej težkou hlavu - C++ je zatraceně složitý jazyk. Počkej až přejdeš na memory managment, ten je, řekl bych, asi nejůležitější částí programu napsaných v C++(sranda teprve začne s používáním vyjímek)
A teď k problému:)
Problém je v tom, že vracíš referenci na LOKÁLNÍ objekt - to už NIKDY nedělej, cokoliv lokálního vracej hodnotou - za to si dej facku. A pokud sis už nafackoval dost, tak tady je řešení:



String operator+(const String& a, const String& b)
{
char *buf = new char[a.length()+b.length()+1]; // alokace dočasného pole
String temp;
if(buf) // pokud se povede alokace(pokud ne asi bych vyhodil vyjimku, ale..)
{ ::strcpy(buf, a.str); // zkopírování textu, který je v a
::strcat(buf, b.str); // připojení dalšího textu
temp = buf; // předání operátoru = doufám, že máš tu implementaci dobře(dalsi alokace/dealokace)
delete [] buf; // smazání dočasného pole
}
return temp; // vracení lokalniho objektu hodnotou = volani kopy konstruktoru(dalsi alokace)
}

Jinak je to docela podivné řešení, ptž se bude alokovat 3x

Nahlásit jako SPAM
IP: ...–
vollf820
Stálý člen
10. 8. 2007   #3
-
0
-

Paráda stačilo to takhle

String operator+(const String & t1, const String t2)

{
String temp;
temp.len = strlen(t1.str) + strlen(t2.str);
temp.str = new char[temp.len+1];
strcpy(temp.str, t1.str);
strcat(temp.str, t2.str);

return temp;
}


Destruktor vypadá takhle, tak to by mělo stačit pro správnou správu paměti ne?

String::~String()

{
delete [] str;
}


Jen dat pryč tu referenci (to sem si nějak neuvědomil) a ještě správně použít strcat(). Díky za nakopnutí ... někdy se zas ozvu :)

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

To vollf82:

jj, to stačilo a máš tam o 1 volání alokace/dealokace méně:). Já jen, že se obvykle řídím tím, že protředky alokuju v konstrukotru a dealokuju v destructoru, ale tady to bla zjevná blbost -facku jsem si dal sám Btw: kontroluj si jestli se alokace povedla.

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, 14 hostů

Podobná vlákna

String to hex ebo Byte()"string" — založil Roman Uherek

Nefunkční spojení s DB — založil mholec

Spojení se serverem — založil Kenvelo

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ý