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

Kopírující konstruktor – C / C++ – Fórum – Programujte.comKopírující konstruktor – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Šťouchal0
Stálý člen
15. 4. 2012   #1
-
0
-

Zdravím,

mám třídu, která je definována jako:

class CDatabase
{
	public:
		CDatabase ( void );
		CDatabase ( const CDatabase & obj );
		~CDatabase( void );
		CDatabase& operator= (const CDatabase &obj);
		// ...
	protected:
		CDriver ** m_Drivers;
		int m_DriversNr;
		CCar ** m_Cars;
		int m_CarsNr;
};

Jak byste vytvořili kopírující konstruktor? Zatím mám toto:

CDatabase::CDatabase ( const CDatabase & obj )
{
	m_DriversNr = obj.m_DriversNr;
	m_Drivers = new CDriver*[m_DriversNr];
	m_CarsNr = m_CarsNr;
	m_Cars = new CCar*[m_CarsNr];

	// ?
}
Nahlásit jako SPAM
IP: 213.168.191.–
KIIV
~ Moderátor
+43
God of flame
15. 4. 2012   #2
-
0
-

vsechny dynamicky data musis jeste zkopirovat.. zatim si jen alokoval dve dynamicky pole...

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Šťouchal0
Stálý člen
15. 4. 2012   #3
-
0
-

Jasné - když to jsou objekty, tak vytvořit jejich kopie, že?

U třídy

class CDriver
{
	protected:
		struct TLog
		{
			string m_Date;
			CCar * m_Car;
		};
		string m_Name;
		string m_Surname;
		TLog * m_Log;
		int m_LogNr;
};

Musím defnovat kopírující konstruktor, který vytvoří novou instanci a předá zpět ukatele?

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

#3 Šťouchal
Zdravím,

je jedno jestli to jsou objekty nebo primitivní datové typy. Důležité je, že ty sám si definuješ sémantiku kopírování - hluboká kopie, transfér vlastnictví, počítání referencí, atd. Pokud chceš dělat hlubokou kopii, tak jednoduše zkopíruješ všechno, co ta třída obsahuje, tak jak píše KIIV.

A v tvém případě:

CDriver::CDriver(const CDriver& other) 
	: m_Name(other.m_Name), m_Surname(other.m_Surname),m_LogNr(other.m_LogNr), 
	m_Log(0) 
{ 
	m_Log = new TLog[m_LogNr]; 
	for(int i = 0; i < m_LogNr; ++i) 
	{ 
		m_Log[i].m_Date = other.m_Log[i].m_Date; 
		m_Log[i].m_Car = new CCar(*other.m_Log[i].m_Car);
	}
} 
Nahlásit jako SPAM
IP: 46.47.155.–
Šťouchal0
Stálý člen
16. 4. 2012   #5
-
0
-

Díky,

po radě kolegy jsem to udělal trošku jinak, do public definice jsem si dal friend třídy a v kopírujícím konstruktoru CDatabase jsem nakopíroval složky a některé objekty znovu vytvořil.

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

Podobná vlákna

Konstruktor — založil Dagi

Konstruktor — založil el

Konstruktor na co? — založil Pavel

Konstruktor / Destruktor — založil Minko

Konstruktor z charu — založil Spectrik

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ý