Funkce vracející referenci na objekt – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Funkce vracející referenci na objekt – C / C++ – Fórum – Programujte.comFunkce vracející referenci na objekt – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Šťouchal0
Stálý člen
15. 4. 2012   #1
-
0
-

Zdravím,

u kódu:

const CCar & CDatabase::FindCar ( const string & RZ ) const
{
	for (int i = 0; i < m_CarsNr; i++)
		if (RZ == (*m_Cars[i]).getRZ())
			return (*m_Cars[i]);
	throw InvalidCarException(RZ);
}

a jeho volání
:

CCar *car = NULL;
// ...
*car = FindCar(RZ); // segmentation fault

se naskytne chyba v práci s pamětí. Mohli byste mi poradit co s tím a proč tomu tak vlatně je?

Nahlásit jako SPAM
IP: 213.168.191.–
crazy
~ Moderátor
+10
Grafoman
15. 4. 2012   #2
-
0
-

#1 Šťouchal
protože nemáš alokovanou paměť... buď jí alokuj a nebo to vytvoř staticky...

ale myslím, že to Progtest stejně netestuje... jen si to vypisuje do streamu... např. 

cout << db->FindCar...

takže ty to v podstatě řešit nemusíš...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Šťouchal0
Stálý člen
15. 4. 2012   #3
-
0
-

Chtěl bych to pro klid své duše mít ošetřeno.

Měl jsem za to, že předávám pouze adresu, protože odkaz na alokovaný objekt v je v poli. Mohl bys mi to prosím více vysvětlit?

Nahlásit jako SPAM
IP: 213.168.191.–
Řešení
crazy
~ Moderátor
+10
Grafoman
15. 4. 2012   #4
-
0
-
Vyřešeno Nejlepší odpověď

#3 Šťouchal
nevracíš adresu, ale pouze tzv. referenci, což je v podstatě alias nebo jiný název pro ten samý objekt... s referencí pak nepracuješ jako s ukazatelem, ale jako s objektem... a vracíš konstantní referenci,  což znamená, že ten objekt nebudeš pomocí té reference moc měnit... čili i kdybys udělal:

CCar *car = NULL;
car = & FindCar(...);

tak to nepujde, protože vracíš const referenci...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Šťouchal0
Stálý člen
15. 4. 2012   #5
-
0
-

Aha, to jsem netušil. Mockrát děkuij za pomoc.

Vyřeším to tak, že si udělám vlatní pomocnou metodu, která mi vrátí ukazatel na objekt, abych s tím mohl dále pracovat. Díky moc.

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