Autor Wątek: Nazwa obiektu wczytana z pliku  (Przeczytany 3033 razy)

jakub765

  • Gość
# Lipiec 29, 2008, 21:58:12
Witam
W c++ progamuję już od dłuższego czasu ale programowania obiektowego dopiero zacząłem się uczyć
w związku z tym mam do was pytanie
czy da się podczas działania programu uworzyć obiekt którego nazwą będzie wczytane z pliku binarnego słowo?

Jak zapisać słowo do pliku binarnego wiem, jak je odczytać też wiem ale niewiem jak utworzyć obiekt którego nazwą będzie to słowo

z góry dziękuje i pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline revo

  • Użytkownik

# Lipiec 29, 2008, 22:11:08

jakub765

  • Gość
# Lipiec 29, 2008, 22:16:47
Dzięki
Mógłby ktoś podać mi przykładowy kod??

jakub765

  • Gość
# Lipiec 29, 2008, 22:31:45

Offline skaarj

  • Użytkownik

# Lipiec 29, 2008, 22:33:54
Widzę, że dobre nastroje przed losowaniem dużego lotka ;p

http://www.codesampler.com/source/dp_factory.zip

Offline Charibo

  • Redaktor

# Lipiec 30, 2008, 01:04:50
Sądzę, że autorowi tematu chodzi o coś innego - gdzie wzorzec fabryki nie pomoże. O ile dobrze zrozumiałem chodzi o wczytanie z pliku nazwy (identyfikatora) konkretnego obiektu w sposób "CKlasa jakasNazwazPliku;". Jest to niestety niemożliwe - chyba, że zrobimy sobię na przykład mapę:
Kod: (cpp) [Zaznacz]
std::map<std::string, CKlasa*> obiekty;
obiekty[jakisStringWczytanyZPliku] = new CKlasa();
obiekty[jakisStringWczytanyZPliku]->DoWhatever(7);

Offline Kos

  • Użytkownik
    • kos.gd

# Lipiec 30, 2008, 01:35:21
Sądzę, że autorowi tematu chodzi o coś innego - gdzie wzorzec fabryki nie pomoże. O ile dobrze zrozumiałem chodzi o wczytanie z pliku nazwy (identyfikatora) konkretnego obiektu w sposób "CKlasa jakasNazwazPliku;". Jest to niestety niemożliwe - chyba, że zrobimy sobię na przykład mapę:
Kod: (cpp) [Zaznacz]
std::map<std::string, CKlasa*> obiekty;
obiekty[jakisStringWczytanyZPliku] = new CKlasa();
obiekty[jakisStringWczytanyZPliku]->DoWhatever(7);
U siebie mam podobnie całe zarządzanie zasobami, ale nie wiedziałem że std::map ma taki fajny operator[] :)

Offline skaarj

  • Użytkownik

# Lipiec 30, 2008, 02:14:40
U siebie mam podobnie całe zarządzanie zasobami, ale nie wiedziałem że std::map ma taki fajny operator[] :)

Tyle tylko, że ten fajny operator jest dużo wolniejszy od funkcji insert.

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Lipiec 30, 2008, 09:02:18
Czemu [] mialby byc duzo wolniejszy od insert'a ? Oba musza zrobic przeszukanie mapy.

Offline revo

  • Użytkownik

# Lipiec 30, 2008, 09:14:45
Czemu [] mialby byc duzo wolniejszy od insert'a ? Oba musza zrobic przeszukanie mapy.

[3] Since operator[] might insert a new element into the map, it can't possibly be a const member function. Note that the definition of operator[] is extremely simple: m[k] is equivalent to (*((m.insert(value_type(k, data_type()))).first)).second. Strictly speaking, this member function is unnecessary: it exists only for convenience.

Wygląda na to, że operator[] najpierw wstawia pod klucz pustą wartość i zwraca referencję do niej, dodatkowo trzeba jeszcze wywołać operator =.
« Ostatnia zmiana: Lipiec 30, 2008, 10:22:12 wysłana przez revo »

Offline BTM

  • Użytkownik

# Lipiec 30, 2008, 09:45:18
Sądzę, że autorowi tematu chodzi o coś innego - gdzie wzorzec fabryki nie pomoże. O ile dobrze zrozumiałem chodzi o wczytanie z pliku nazwy (identyfikatora) konkretnego obiektu w sposób "CKlasa jakasNazwazPliku;". Jest to niestety niemożliwe - chyba, że zrobimy sobię na przykład mapę:
Kod: (cpp) [Zaznacz]
std::map<std::string, CKlasa*> obiekty;
obiekty[jakisStringWczytanyZPliku] = new CKlasa();
obiekty[jakisStringWczytanyZPliku]->DoWhatever(7);
U siebie mam podobnie całe zarządzanie zasobami, ale nie wiedziałem że std::map ma taki fajny operator[] :)
To jak już robisz sobie mapę obiektów, to może szybciej zrobić kilka IFów ze strcmp ?if(!strcmp(wczytanyTekst,"mojaUberKlasa")) obj = new mojaUberKlasa();

Offline Hadrian W.

  • Użytkownik
    • Homepage

# Lipiec 30, 2008, 09:45:39
Dodatkowo zamiast zwykłej std::mapy warto się zainteresować obecną już w niektórych kompilatorach std::tr1::unsorted_map jest po prostu szybsza (jest w gcc 4.3) :) Jest to hashmapa. Ew. jeżeli nie jest dostępna w kompilatorze, którego używasz to zobacz czy nie obsługuje rozszerzeń ,Xion opisał to na swoim blogu. GCC ma/miało również rozszerzenie.

Jeśli chcesz czegoś więcej niż tworzenie obiektów o znanych typach (powiedzmy coś na kształt typu ładowanego z pliku w trakcie działania programu) to zainteresuj się Data Driven. Ze swojej strony mogę podać kilka linków:
* A Generic Function Binding Interface
* A Data-Driven Game Object System
* "Building Object Systems" by Alex Duran (GDC 2003)
* "Object Systems" by Doug Church
* "Data-Driven Programming Made Easy" by Eric Malafeew (GDC 2005)

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Lipiec 30, 2008, 10:20:26
Revo > czas tworzenia elementu jest porownywalny z czasem przeszukania mapy ??

Wiadomo, ze zalezy od uzytych typow. Powiedzmy, ze uzywamy <std::string, std::string>, a w mapie juz jest kilkadziesiat elementow

jakub765

  • Gość
# Lipiec 30, 2008, 11:17:09
Dzięki
jednak gdy próbuje użyć tego kodu:
Kod: (cpp) [Zaznacz]
std::map<std::string, CKlasa*> obiekty;
obiekty[jakisStringWczytanyZPliku] = new CKlasa();
obiekty[jakisStringWczytanyZPliku]->DoWhatever(7);
to wywala mi błąd:
'map' : is not a member of 'std'

Offline SiMet

  • Użytkownik

# Lipiec 30, 2008, 11:20:25
#include <map>

??