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";
}