Objectumok ciklussal

 ( BlinTux | 2008. augusztus 19., kedd - 2:23 )

Sziasztok!

Lenne egy kis problemam az objectumok letrehozasaval. Futasi idoben kellene oket letrehozni, es nem tudni elore hany lesz beloluk. Lenyeg, hogy lenne ket valtozo, amiknek az erteke ciklusonket valtozik es nem szam, hanem string tipusuak.

Manualissan letrehozva igy nez ki:

Building *bighouse = new Building(Building::Model_1, this);
bighouse->setSize(X, Y);

Amit valtozobol kellene letrehozni az a bighouse es a Model_1
Tehat:

Building *valtozo1 = new Building(Building::valtozo2, this);
valtozo1->setSize(X, Y);

Sajnos fogalmam sincs, hogy lehetne ezekre a helyekre a valtozok erteket beilleszteni.
A segitseget elore is koszonom!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

#include <vector>

//ebben lesznek a Building objektumok pointerei, dinamikusan bovitheto
std::vector<Building *> x;  

//ideiglenesen ebben a valtozoban lesz tarolva az objektumra mutato pointer
Building *tmp;

//for ciklussal 5 uj Bulding objektumot hozunk letre, es hozzaadjuk a vectorhoz
for (int i = 0; i < 5; ++i) 
{
    tmp = new Building(randomstring, this);
    tmp->setSize(X,Y);
    x.push_back(tmp);
}

A vector dinamikusan bovul, kesobb a vectorhoz adott elemeket az at() tagfuggvennyel, vagy [] operatorral tudod elerni. Lasd: http://cppreference.com/cppvector/index.html

Bar nem biztos, hogy jol ertem mit akarsz :)
--
ahan nem

Koszi!

Marcsak egy gondom van vele. A randomstring valtozo tipusat nem tudom deklaralni. Vagyis nem ugy ahogy kellene. Jelenleg igy nez ki:

Building::BuildingType randomstring = Building::Model_1;

Building *tmp = new Building(randomstring, this);

Ez igy mukodik eddig. Csak a randomstring, mint a neve is mutatja, jonne stringbol. Viszont ha egy stringet adok at neki, jon az uzenet:
"error: cannot convert ‘std::string’ to ‘Building::BuildingType’ in initialization"

Valahogy a stringet kellene atalakitanom a sajat tipusomra.

Ha jol ertem amit szeretnel, akkor egy string tipusu valtozod van, de a konstruktorban meg sajat tipust kene hasznalnod attol fuggoen, hogy mi a string erteke.

Ezt valami "atvalto" fuggvennyel tudod legfajdalommentesebben (legkevesebb modositassal) megoldani, bar a kod ismereteben (es kicsit atirasaval) valoszinu lehetne jobb megoldast is talalni. Valahogy igy csinalnam:

#include <string>
//a parameterkent atadott string alapjan visszaad egyet a sajat ertekeid kozul
Building::BuildingType string2btype(std::string input)
{
    if (input.compare("szoveg1") == 0) {
        return sajatertek1;
    } else if (input.compare("szoveg2") == 0) {
        return sajatertek2;
    ...
    }
}

Es akkor a konstruktort igy tudod hivni:

Building *tmp = new Building(string2btype("ideaszoveg"), this); 

Aztan ezt a fuggvenyt oda rakod ahova akarod, pl statikuskent az osztalyba, osztalyon kivul stb.
De van meg ezen kivul sok mas (szebb) megoldas is.

--
ahan nem

Igen, sajnos a szebb megoldas kellene, amiben nem elegazasokkal oldom meg, hanem a stringet alakitom BuildingType-a. Meg kiserletezek, de nem jutok semmi jora :(

Nem tudom milyen tipus ez a BuildingType, de van egy olyan erzesem, hogy nem lehet siman konvertalni ide-oda. Konvertalas nelkul, de szebb megoldas, ha egy map kontenert elore feltoltesz a string->BuildingType parossal, es akkor a konstruktorhoz ebbol szeded a BuildingType erteket. Ehhez nem kell elagazas.

Pelda:

#include <map>
#include <string>

//kontener deklaralasa valahol
std::map<std::string, BuildingType> btmap;

//kontener feltoltese par ertekkel valahol a programban
btmap.insert(make_pair("szoveg1", BuildingType_1));
btmap.insert(make_pair("szoveg2", BuildingType_2));
//vagy
btmap["szoveg1"] = BuildingType_1;
btmap["szoveg2"] = BuildingType_2;

//konstruktort meg igy hivod, termeszetesen a szukseges ellenorzesek utan
Building *tmp = new Building(btmap["szoveg1"], this);

Ugyancsak lasd a fentebb linkelt oldalt, ott van map-rol is mindenfele info.

szerk: Csak ugy kivancsisagbol: mi a baj az elagazassal?

--
ahan nem

Koszi a sok segitseget, kozben megoldottam ugy, hogy teljessen atirtam a mukodes menetet:)
Sima szam azonositassal tortenik minden, igy eleg egy int es kessz. Annyi, hogy majd nekem fel kell irni, hogy melyik azonosito mihez is tartozik, mert a nevebol nem derul ki ugye:)
Az elagazas meg azert gaz, mert nem tudom hany azonositom lesz, mert azok egy XML fajlbol kerulnek be es raadasul tobb XML fajl is lesz.
Lenyeg a lenyeg, most mukodik:)

Koszi megegyszer mindent!

cserébe ígérd meg, hogy egyszer felütsz egy bevezetés az oop-be tutorialt a polimorfizmus címszónál

miert kellene felirni? hasznalj #define-okat vagy enumot, ne adj'isten sima tömböt

Ja. Valahogy így:

#define A_NULLADIK 0
#define AZ_EGYES   1
#define A_KETTES   2
#define A_HARMAS   3
// stb


int main() {
   // ....
   x = fuggveny(AZ_EGYES);
   // ...
}

Persze ennél értelmesebb elnevezéseket kellene használni.