[c++]Chyba trudne pytanie...

dział ogólny

[c++]Chyba trudne pytanie...

Nowy postprzez lidamian » niedziela, 28 grudnia 2008, 17:46

Witajcie,

Napisałem klasę posiadającą bufor, w którym zapisane są różne zmienne różnego typu.

Np.:
Kod: Zaznacz cały
Byte Bufor[30000] = "T.u. .n.a.p.i.s.0.a.65535.255.I. .z.n.o.w.u. .n.a.p.i.s";

Bufor posiada 6 zmiennych:
1. string o długości 8 (Tu napis)
2. bool o dł. 1 (0)
3. char o dł. 1 (a)
4. int o dł. 4 (bo sizeof(int) = 4) (65535)
5. Byte o dł. 1 (255)
6. string o dł. 13 (i znowu napis)

Problem pojawia się kiedy chcę zwrócić te zmienne.
Napisałem funkcję zwracającą odpowiednią zmienną pod podanym indeksem:

Kod: Zaznacz cały
template<class Type>
Type Klasa::GetParam(int Index)
{
   ...
   return *(Type*)&Bufor[WyliczPozycje(Index)];
}


Wywołanie wygląda tak:
Kod: Zaznacz cały
int OczekiwanaZmienna = klasa->GetParam<int>(4);


Ale ja chciałbym napisać funkcję GetParam tak żeby wywołanie wyglądało następująco:
Kod: Zaznacz cały
int OczekiwanaZmienna = klasa->GetParam(4);

Dodam, że moja klasa nie dość że wie pod jakim indexem w buforze ma szukać (WyliczPozycje) to wie jakiego typu jest ta zmienna.
Problem w tym, że ja nie wiem jak napisać funkcję która sama zmieniałaby swój typ (widząc na jaki).

W przykładzie chciałem żeby zwrócono mi zmienną pod indeksem 4. ale musiałem jeszcze dodatkowo podawać typ (int) tej zmiennej pomimo, że jest ona znana przez samą klasę! Chcę ten obowiązek zrzucić na klasę.

Jak to zrobić?
Avatar użytkownika
lidamian
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): piątek, 19 września 2008, 15:25
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: [c++]Chyba trudne pytanie...

Nowy postprzez Cyfrowy Baron » niedziela, 28 grudnia 2008, 18:46

Klasy ogólne w C++ tworzy się zasadniczo tak:

Kod: Zaznacz cały
template <class Type> Type GetParam(Type Index)
{
return //coÅ› tam zwraca
};


wywołanie będzie wtedy wyglądać tak:

Kod: Zaznacz cały
int OczekiwanaZmienna = klasa->GetParam(4);


dla Twojego przykładu powinno to chyba (chyba - gdyż nie mam wglądu w kod, ani w to co chcesz osiągnąć) wyglądać tak:

Kod: Zaznacz cały
template<class Type>
Type Klasa::GetParam(Type Index) // tutaj Type zamiast int
{
   ...
   return *(Type*)&Bufor[WyliczPozycje(Index)];
}


Być może nie zrozumiałem co chcesz zrobić, ale Twoja wina, gdyż tak tłumaczysz...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: [c++]Chyba trudne pytanie...

Nowy postprzez Witold » niedziela, 28 grudnia 2008, 18:57

Z ciekawości: Czemu nie pasuje Ci ten zapis:
Kod: Zaznacz cały
int OczekiwanaZmienna = klasa->GetParam<int>(4);

czemu chcesz opuścić "<int>"? przecież i tak musisz podać typ zmiennej OczekiwanaZmienna.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: [c++]Chyba trudne pytanie...

Nowy postprzez lidamian » niedziela, 28 grudnia 2008, 19:15

Tak myślałem, że nie zrozumiecie zadanego problemu z mojego opisu (a uwierzcie, że bardzo trudno to wytłumaczyć bo klasa jest w miarę złożona).
Zatem nie postawiÄ™ teraz pytania a problem:

Wyobraźcie sobie klasę posiadającą funkcję, która zwraca różne typy danych w zależności od podanego jej parametru.

Przykład:

Kod: Zaznacz cały
TImagineClass *Klasa = new TImagineClass();

char Zmienna0 = Klasa->Funkcja(0); // zwraca typ char bo parametr = 0
int Zmienna1 = Klasa->Funkcja(1); // zwraca typ int bo parametr =1
short Zmienna2 = Klasa->Funkcja(2); // zwraca typ short bo parametr = 2
bool Zmienna3 = Klasa->Funkcja(3); // zwraca typ bool bo parametr = 3


Moim zamierzeniem jest osiągnięcie funkcji zwracającej różne typy danych ale napisanej tak żeby wywołując ją nie trzeba było pisać np:
Kod: Zaznacz cały
char Zmienna = (char)Klasa->Funkcja(0);

czy
Kod: Zaznacz cały
char Zmienna = Klasa->Funkcja<char>(0);


Nie chcę używać takiego zapisu bo chcę sprawdzić czy c++ jest aż tak elastyczne jak go malują ;P

Więc da się coś takiego osiągnąć?
Avatar użytkownika
lidamian
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): piątek, 19 września 2008, 15:25
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: [c++]Chyba trudne pytanie...

Nowy postprzez Cyfrowy Baron » niedziela, 28 grudnia 2008, 19:43

Teraz rozumiem! Nie widzę sposobu na realizację tego zadania. Funkcja zwraca taki typ jaki jej zadeklarujesz, a funkcja ogólna zwraca typ int.
Można by wykorzystać przeciążenie funkcji, ale tutaj jest to zależne od argumentów przekazywanych funkcji - muszą być różnych typów, a nie różnych wartości:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
int Funkcja(int Index)
{
return 100;
}

String Funkcja(String Index)
{
return "typ string";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text  = Funkcja(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit2->Text = Funkcja("0");
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: [c++]Chyba trudne pytanie...

Nowy postprzez lidamian » niedziela, 28 grudnia 2008, 19:55

Czyli rozwiązanie nie istnieje ;/ No nic to będę musiał dziergać to "<int>", "<short>" ... przy funkcjach ;/

Dzięki za odpowiedź ;)
Avatar użytkownika
lidamian
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): piątek, 19 września 2008, 15:25
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości