Kezdőoldal » Számítástechnika » Programozás » (C++) Lehet létrehozni olyan...

Qaxqaxqax kérdése:

(C++) Lehet létrehozni olyan vektort aminek minden eleme tetszőleges típusú?

Figyelt kérdés
pl.: első eleme string típusú a többi pedig int, vagy hasonlót. Ha nem valami megoldás ilyen dolgok dinamikus eltárolására egymás mellett? (Pl.: ha a stringesnél maradunk akkor: név:string kor:int magasság:int ...)

2013. máj. 22. 22:06
 1/8 anonim ***** válasza:
Ilyen adatbázisokhoz inkább az osztályokat szokták használni.
2013. máj. 22. 22:20
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:
erre a struktúra (rekord) való. A tömb homogén adatszerkezet.
2013. máj. 22. 22:51
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:
struct
2013. máj. 22. 23:30
Hasznos számodra ez a válasz?
 4/8 iostream ***** válasza:
És hogy használnád ezt a szerkezetet? Ha mindig ugyanazon a pozíción vannak az adott típusú dolgok, akkor valóban struct a barátod, egyébként meg hogy döntenéd el, hogy az adott indexen milyen típus van?
2013. máj. 23. 09:40
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:

Akkor, ha a vector minden eleménél ugyanaz az adatszerkezet, akkor egy struct-ot használhatsz.


Ha nem, akkor pedig két opciód van:

1. használsz egy dinamikus adattípus osztályt. Ezek úgy működnek, hogy egy érték és egy típus mutatót tartalmaznak, vagyis futásidőben meg lehet határozni a típusukat, de mégis fix hosszúságúak (2 mutató), így el lehet őket tárolni egy vektorban. Erre vannak kész megoldások, egész biztosan.


2. Az összes vectorba kerülő objektum osztályát a vector template típusából eredezteted, és beágyazott vektort használsz. pl így.

class AlapTípus {};

class Valami : AlapTípus {};

vector<vector<AlapTípus>> v;


Ebben a példában a v vector elemeibe Valami és AlapTípus típusú objektumokat is be lehet illeszteni. Hogy ez hogyan valósul meg, az változó, de nem kell vele foglalkoznod. A C++ szabvány előírja, hogy ennek a megoldásnak tökéletesen működni kell.

2013. máj. 23. 09:41
Hasznos számodra ez a válasz?
 6/8 iostream ***** válasza:
Utolsó: a 2. pontod nettó baromság. A belső vektor típusa kötődik a T típushoz, a külsőé pedig a belső vektorhoz. Nem tudsz belerakni leszármazott típusokat (a kód fordulhat, ha úgy vannak megírva a típusok, de akkor is ősosztály objektum lesz benne). Amire gondolsz az a pointerezés. Ha mutatókat pakolsz bele, akkor valóban lehetnek leszármazottak, viszont a kérdező intes példáján ez sem segít. Ha ténylegeseb teljesen homogén kell akkor csak a te 1. megoldásod működik: egy mutató (void*) és egy típusleíró (ennek nem kell mutatónak lennie), ehhez viszont előre tudni kell a használható típusokat, és eleve rusnya megoldás, szinte biztos, hogy nem akarod ezt igazából.
2013. máj. 23. 12:02
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:

"Utolsó: a 2. pontod nettó baromság. A belső vektor típusa kötődik a T típushoz, a külsőé pedig a belső vektorhoz. Nem tudsz belerakni leszármazott típusokat (a kód fordulhat, ha úgy vannak megírva a típusok, de akkor is ősosztály objektum lesz benne). Amire gondolsz az a pointerezés."


Jogos, ezt hívják object slicing-nek. Valóban pointert kell átadni a base class-hoz. Viszont, ha a polimophikus függvények virtual-ként vannak megvalósítva, akkor így működnie kell. Szerintem, ez az esetek többségében jobb, mint az első megoldás, ugyanis ne akarjunk már bármilyen objektumot beletenni. Szerintem általában csak az a típust lehessen beletenni, ami arra lett tervezve. Ez jobban kizárja a hibalehetőséget szerintem. Meg átláthatóbb is.

2013. máj. 23. 12:16
Hasznos számodra ez a válasz?
 8/8 anonim ***** válasza:
67%

használhatsz akár uniont is, amiben olyan classokat tárolsz,

amiknek az első tagja egy enum a tartalmazott típusra vonatkozólag,

a második pedig maga a típuspéldány (már ha mindenáron a kérdésben szereplő dolog kell)

viszont ez annyira gány, és semmire nem való, hogy inkább csak mutatom:


enum StoresWhat {integer, doublep};


class Int_class {

public:

StoresWhat type;

int data;

void set(int x) {type=integer; data=x;}

};


class Double_class {

public:

StoresWhat type;

double data;

void set(double x) {type=doublep; data=x;}

};



union Collection {

StoresWhat type;

Int_class m_int;

Double_class m_double;

};


int main() {


std::vector<Collection> tarolo;


Collection x,y;

x.m_int.set(5);

y.m_double.set(6.5);


tarolo.push_back(x);

tarolo.push_back(y);


return 0;

}



Akár használhatsz class templatet is, aztán heterogén kollekció:


class WrapperBase {

public:

StoresWhat type;

};


template<class T>

class Wrapper : public WrapperBase {

public:

T data;

};



De inkább pontosítsd a problémádat, biztos sokkal egyszerűbb a megoldás mint ez a sok okádék

2013. máj. 23. 12:44
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!