Volitelne id zlozene z viacerych typov – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Volitelne id zlozene z viacerych typov – C / C++ – Fórum – Programujte.comVolitelne id zlozene z viacerych typov – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
vitamin+8
Grafoman
23. 12. 2012   #1
-
0
-

Mam program kde mam mnozstvo tried ktore su odvodene z bazovej triedy ktora ma atribut ID. Tento atribut moze byt typu std::string alebo int(vzdy ma len jeden typ), casom mozno bude moct mat viecej typov . Zaroven ale moze nastat moznost ze objekt nema ziadne id(porovnanie id-eciek 2 objektov kotre nemaju specifikovane id sa musy vyhodnoti ako false). Rad by som bol aby sa zbytocne nealokovala pamet na heape v std::string ak nie je treba (rychlost programu je dvolezita).

Zatial to riesim tak ze atribut ID je typu Id:

class Id{
		union{
			std::string	name;
			int key;
		};
		enum class type_e{
			String,
			Key,
			Unknown
		};
		type_e type;

	public:
		Id():type(type_e::Unknown){}
		Id(const std::string &name):type(type_e::String){
			new(&this->name) std::string(name);
		}
		Id(int key):type(type_e::Key){
			this->key = key;
		}
		Id(const Id& id){
			switch(id.type){
				case type_e::String:
					new(&this->name) std::string(id.name);
					type = type_e::String;
					break;
				case type_e::Key:
					key = id.key;
					type = type_e::Key;
					break;
				case type_e::Unknown:
					type = type_e::Unknown;
					break;
			}
			return;
		}
		Id(Id&& id){
			switch(id.type){
				case type_e::String:
					name = std::move(id.name);
					type = type_e::String;
					id.type = type_e::Unknown;
					break;
				case type_e::Key:
					key = id.key;
					type = type_e::Key;
					break;
				case type_e::Unknown:
					break;
			}
			return;
		}
		Id& operator=(const Id& id){
			if(id.type != type){
				//treba uplne prerobyt pri zmene type_e
				if(id.type == type_e::String){
					new(&this->name) std::string(id.name);
					type = type_e::String;
				}
				else if(type == type_e::String){
					name.~string();
					key = id.key;
					type = id.type;

				}
			}
			else{
				switch(type){
					case type_e::String:
						name = id.name;
						break;
					case type_e::Key:
						key = id.key;
						break;
					case type_e::Unknown:
						break;
				}
			}
			return *this;
		}
		bool operator==(const Id& id)const{
			if(id.type == type){
				switch(type){
					case type_e::String:
						return (name == id.name);
					case type_e::Key:
						return (key == id.key);
					case type_e::Unknown:
						return false;
				}
			}
			return false;
		}
		bool operator!=(const Id& id)const{
			if(id.type == type){
				switch(type){
					case type_e::String:
						return (name != id.name);
					case type_e::Key:
						return (key != id.key);
					case type_e::Unknown:
						return true;
				}
			}
			return true;
		}

		~Id(){
			if(type == type_e::String)name.~string();
		}
};

Neda sa to riesit dako pomocou stl (pripadne boost... )? Ak nie, je ta trieda co mam dobre? (valgrind mi zatial nic nenasiel) 

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Reklama
Reklama
zlz
~ Anonymní uživatel
634 příspěvků
24. 12. 2012   #2
-
0
-

Není to dobře. Name se ti vždycky vytvoří a zruší (a key je nepoužitelný). A do toho na něm vytváříš a rušíš další string. Překvapuje mě, že to funguje. Neřve to už při překladu, že máš string v unionu?

V Boost je Variant a Any, ale to je tady asi zbytečné, prostě tam vraz ukazatel.

Nahlásit jako SPAM
IP: 80.188.216.–
vitamin+8
Grafoman
24. 12. 2012   #3
-
0
-

#2 zlz
prekladam to v rezime c++11, takze mozem mat v unione aj typy s netrivialnym konstruktorom, nevyhoda je ze sa nevolaju ani konstruktory a ani destruktory, cize ich musim volat rucne. 

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV+42
God of flame
24. 12. 2012   #4
-
0
-

coz nemeni nic na tom, ze je to prasarna...  pouzij ten boost nebo si udelej vlastni polymorfni tridu na ulozeni tech hodnot

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
24. 12. 2012   #5
-
0
-

skusim pouzit ten boost::variant, dik.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Grungy0
Super člen
25. 12. 2012   #6
-
0
-

Nepomohlo by ti skôr, keby si v bázovej triede len definoval operácie == a !=  a potom v odvodených triedach si tam dáš ID akého typu potrebuješ?

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
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, 96 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý