Ukládání potomků jedné nadtřídy do jednoho seznamu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukládání potomků jedné nadtřídy do jednoho seznamu – C / C++ – Fórum – Programujte.comUkládání potomků jedné nadtřídy do jednoho seznamu – C / C++ – Fórum – Programujte.com

 

Shaolin
~ Anonymní uživatel
11 příspěvků
24. 2. 2009   #1
-
0
-

Ahoj,
jsem začátečník a snažím se mít jednoho předka a z něj dělat potomky. Tyto potomky chci vkládat do jednoho seznamu a pak mít možnost je z něj zase vytahovat. Chci se zeptat, jestli si myslíte, že to nějak lze. Uvádím můj pokus, který snad jasně ukazuje o co mi jde, ale nefunguje mi :-(

Díky za každé rady a tipy.

#include <cstdlib>
#include <iostream>
#include <list>
#include <string.h>

using namespace std;

class Tvar {
protected:
int x, y;
public:
Tvar() {x = 0; y = 0;} ;
int getX() {return x;};
int getY() {return y;};
};

class Obdelnik: public Tvar {
int sirka, vyska;
public:
Obdelnik(const int &sx, const int &sy, const int &sir, const int &vys) {
x = sx;
y = sy;
sirka = sir;
vyska = vys;
};
int getSirka() {return sirka;};
};

int main(int argc, char *argv[])
{
list<Tvar> seznam;
Obdelnik obd(2, 0, 0, 0);
seznam.push_back(obd);
Obdelnik obd1(3, 1, 1, 1);
seznam.push_back(obd1);

list<Tvar>::iterator it;
for (it=seznam.begin(); it!=seznam.end(); it++) {
Obdelnik *obd3 = (Obdelnik*) &*it;
cout << obd3->getSirka();
}
system("PAUSE");
return EXIT_SUCCESS;
}

Nahlásit jako SPAM
IP: 85.207.245.–
Shaolin
~ Anonymní uživatel
11 příspěvků
24. 2. 2009   #2
-
0
-

Přikládám moje druhé řešení pomocí pointerů. Tady ale zase narážím na problém, že se mi ruší mnou vytvořené objekty a pak seznam ukazuje na neplatné pointery. Už si nevím rady.

#include <cstdlib>
#include <iostream>
#include <list>
#include <string.h>

using namespace std;

class Tvar {
protected:
int x, y;
public:
Tvar() {x = 0; y = 0;} ;
int getX() {return x;};
int getY() {return y;};
};

class Obdelnik: public Tvar {
int sirka, vyska;
public:
Obdelnik(const int &sx, const int &sy, const int &sir, const int &vys) {
x = sx;
y = sy;
sirka = sir;
vyska = vys;
};
int getSirka() {return sirka;};
~Obdelnik() {cout << "zrusen";};
};

class Seznam {
private:
list<Tvar*> seznam;
public:
Seznam() {};
void vloz(Obdelnik &obd) {
seznam.push_back(&obd);
};
void vyjmi() {
list<Tvar*>::iterator it;
for (it=seznam.begin(); it!=seznam.end(); it++) {
Obdelnik *obd = (Obdelnik*) *it;
cout << obd->getSirka();
}
}
};

int main(int argc, char *argv[])
{
int poradi = 0;

// toto funguje, ale je to neprakticke na pouziti
// Obdelnik obd(2, 0, 0, 0);
// sez.vloz(obd);
// Obdelnik obd2(2, 0, 1, 0);
// sez.vloz(obd2);
// Obdelnik obd3(5, 0, 5, 0);
// sez.vloz(obd3);
// sez.vyjmi();

// po provedeni tohoto jsou spatne pointery, protoze se objek Obdelnik prubezne rusi, jak to vyresit?
Seznam sez;
for (poradi = 0; poradi < 5; poradi++) {
Obdelnik obd(2, 0, poradi, 0);
sez.vloz(obd);
};
sez.vyjmi();

system("PAUSE");
return EXIT_SUCCESS;
}

Nahlásit jako SPAM
IP: 85.207.245.–
KIIV
~ Moderátor
+43
God of flame
25. 2. 2009   #3
-
0
-

pokud vim tak kdyz tu rodicovskou tridu pouzijes jako prvek seznamu melo by do toho jit nacpat i potomky .. potom je ale musis umet zase vytahat.. a taky asi pro pouzivany metody ktery se jmenujou vsude stejne pouzit virtual - aby se pouzila metoda te tridy kterou zrovna zpracovavas a ne ta rodice

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Shaolin
~ Anonymní uživatel
11 příspěvků
25. 2. 2009   #4
-
0
-

Tak už jsem to vyřešil. V tom for cyklu je třeba obdélníky vytvářet dynamicky. Takže teď to volám takto: seznam.vloz(new Obdelnik(1, 2, 3, 4); diky

Nahlásit jako SPAM
IP: 82.142.106.–
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, 101 hostů

Podobná vlákna

Z jednoho řetězce tři — založil SuperAdmin

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ý