Anonymní profil Jan – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Jan – Programujte.comAnonymní profil Jan – Programujte.com

 

Příspěvky odeslané z IP adresy 194.228.11.–

Jan
C / C++ › C++ template a podmínky
6. 12. 2012   #168258

Tak jsem to nakonec vyřešil přes ten dynamic_cast...

Všechny objekty dědí z abstraktní třídy BaseSystemObject, do té metody v ContextManager-u je vstupem pointer na BaseSystemObject a ten po přijetí přetypuji na objekt podle potřeby.

void ContextManager::setContext(BaseSystemObject *object_reference){
	if(object_reference->object_name == "SystemManager"){
		object__system_manager = dynamic_cast<SystemManager*>(object_reference);
	}
	if(object_reference->object_name == "ConfigManager"){
		object__config_manager = dynamic_cast<ConfigManager*>(object_reference);
	}
	if(object_reference->object_name == "VideoManager"){
		object__video_manager = dynamic_cast<VideoManager*>(object_reference);
	}
}

Díky za pomoc.

Jan
C / C++ › C++ template a podmínky
6. 12. 2012   #168240

#8 zlz
Díky za reakci, ale tohle mě napadlo taky. Udělat to stupid-friendly (hromada set/get metod) není až tak těžké, ale snažím se to vyřešit trochu inteligentněji. Vzhledem k plánu, že to bude ve výsledku poněkud komplikovanější program, tak tam nechci mít desítky přetížených metod. Nepřijde mi to jako nejlepší řešení, i přes to, že je nejjednodušší.

PS.: To naučení se časem se právě teď snažím realizovat. ;)

Jan
C / C++ › C++ template a podmínky
6. 12. 2012   #168238

#6 vitamin
Jop, díky. :)  Už jsem se mezi tím o dynamic_cast dočetl a zkouším to pomocí něj. Uvidíme, jak to půjde.

K tomu špatnému návrhu programu - je to možné. Hezkých pár let jsem pořádně neprogramoval, teď se k tomu vracím a rovnou jsem začal s C++. 
Když už jsi zmínil návrh programu, mám k tomu taky dotaz. Jak se v OOP řeší komunikace mezi objekty? Když jeden objekt chce zavolat metodu druhého, je potřeba mít nějakou referenci na ten druhý objekt, tak se snažím udělat správce těchto objektů. Odkaz na něj dostane každý objekt a z něj si vytáhne odkazy na ostatní, které bude potřebovat pro práci. Uvažuju nad tím až tak špatně?

Jan
C / C++ › C++ template a podmínky
6. 12. 2012   #168235

#4 crazy
To už jsem zkoušel, byla to v podstatě druhá věc, která mě napadla. Problém je, že se pak v main-u nedostanu k metodám objektů, které jsou uložen v ContextManageru.

Např.:
main__context_manager.object__system_manager->printColoredText("Main program started", 12);
V tomhle případě například k základní metodě SystemManageru, tedy metodě printColoredText...

Předpokládám, že z důvodu, že ten objekt je v tu chvíli typu BaseSystemObject (můj předek sysémových objektů), resp. v tvém příkladě typu Manager. Asi pak nejsou vidět metody, které např. ten SystemManager má. 

Možná k tomu přistupuji špatně, něco jsem opomenul, nebo uvažoval špatně, nevím.

Jan
C / C++ › C++ template a podmínky
6. 12. 2012   #168230

#2 crazy
Můžeš prosím rozvést, jak to myslíš?

Jan
C / C++ › C++ template a podmínky
6. 12. 2012   #168228

Dobrý den,
řeším už třetí den problém týkající se předání několika objektů funkci, která je zpracuje dál. Problém jsem se rozhodl řešit pomocí template, ale vzhledem k faktu, že jsem tento aspekt jazyka C++ do dnes nikdy nepoužil, někde zřejmě dělám chybu.

Princip předpokládané funkčnosti:
Ve funkci main vytvořím instanci třídy ContextManager, která má za úkol spravovat reference na ostatní důležité objekty systému, resp. programu(SystemManager, ConfigManager, VideoManager, ...). Po té se zavolá funkce setContext, která je řešená pomocí template a má za úkol přijmout některý z výše uvedených systémových objektů a uložit odkaz, nebo nějakou vazbu na něj v ContextManager-u pro další použití. Každý z ostatních systémových objektů (SystemManager, ConfigManager, VideoManager, ...) očekává ve svém konstruktoru ukazatel na instanci ContextManager-u, aby měl přístup k veškerým objektům, které budou uloženy v ContextManageru.
 

Problém:
Ve třídě ContextManager, resp. jeho fci setContext, která je (nebo by podle mého plánu být měla :)) generická (template), přijmu systémový objekt a podle vlastnosti object_name tohoto objektu větvím ukládání objektu do předpřipraveného pointeru, pro něj určeného. Fce v základu funguje jak má, ale ve chvíli kdy odkomentuji, resp. přidám do každé if větve řádek
this->object__system_manager = &object_reference;
tak kompilátor (VS2010) začne křičet, že to nepůjde...
 

Takže tedy prosím o radu někoho zkušenějšího, než jsem já. Nevím jak kód přepsat, aby vše fungovalo, nebo jakým jiným způsobem danou funkčnost řešit. Snad mi někdo ušetříte pár vrásek, jsem z toho už celkem zoufalý... :)

Díky za Vaše odpovědi

Výpis kompilátoru:

------ Build started: Project: client (Visual Studio 2010), Configuration: Debug Win32 ------
1>  main.cpp
1>d:\programing\cpp11\project_game_2\client\contextmanager.h(70): error C2440: '=' : cannot convert from 'SystemManager *' to 'ConfigManager *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>          d:\programing\cpp11\project_game_2\client\main.cpp(59) : see reference to function template instantiation 'void ContextManager::setContext<SystemManager>(generic_system_object)' being compiled
1>          with
1>          [
1>              generic_system_object=SystemManager
1>          ]
1>d:\programing\cpp11\project_game_2\client\contextmanager.h(78): error C2440: '=' : cannot convert from 'SystemManager *' to 'VideoManager *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>d:\programing\cpp11\project_game_2\client\contextmanager.h(62): error C2440: '=' : cannot convert from 'ConfigManager *' to 'SystemManager *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>          d:\programing\cpp11\project_game_2\client\main.cpp(63) : see reference to function template instantiation 'void ContextManager::setContext<ConfigManager>(generic_system_object)' being compiled
1>          with
1>          [
1>              generic_system_object=ConfigManager
1>          ]
1>d:\programing\cpp11\project_game_2\client\contextmanager.h(78): error C2440: '=' : cannot convert from 'ConfigManager *' to 'VideoManager *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>d:\programing\cpp11\project_game_2\client\contextmanager.h(62): error C2440: '=' : cannot convert from 'VideoManager *' to 'SystemManager *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>          d:\programing\cpp11\project_game_2\client\main.cpp(64) : see reference to function template instantiation 'void ContextManager::setContext<VideoManager>(generic_system_object)' being compiled
1>          with
1>          [
1>              generic_system_object=VideoManager
1>          ]
1>d:\programing\cpp11\project_game_2\client\contextmanager.h(70): error C2440: '=' : cannot convert from 'VideoManager *' to 'ConfigManager *'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Kód je zde zjednodušený, pouze na věci týkající se problému
 

fce main

ContextManager main__context_manager = ContextManager();

main__context_manager.setContext<SystemManager>(SystemManager(&main__context_manager));

main__context_manager.setContext<ConfigManager>(ConfigManager(&main__context_manager));

main__context_manager.setContext<VideoManager>(VideoManager(&main__context_manager));


ContextManager.h

#ifndef __CONTEXT_MANAGER_H__
#define __CONTEXT_MANAGER_H__

#include <iostream>

#include "SystemManager.h"


class SystemManager;
class ConfigManager;
class VideoManager;

class ContextManager{
	public:
		ContextManager();
		
		template <class generic_system_object> void setContext(generic_system_object object_reference);

		SystemManager *object__system_manager;
		ConfigManager *object__config_manager;
		VideoManager *object__video_manager;
};


ContextManager::ContextManager(){
	
}

template <class generic_system_object> void ContextManager::setContext(generic_system_object object_reference){
	if(object_reference.object_name == "SystemManager"){
		this->object__system_manager = &object_reference;
	}
	if(object_reference.object_name == "ConfigManager"){
		this->object__config_manager = &object_reference;
	}
	if(object_reference.object_name == "VideoManager"){
		this->object__video_manager = &object_reference;
	}
}


#endif


takhle vypadá konstruktor všech systémových objektů (příklad):

SystemManager::SystemManager(ContextManager *local__context_manager){
  object_name = "SystemManager";}

 

 

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