[C++] *this
Ostatnio zmodyfikowano 2015-12-05 07:28
pepe450 Temat założony przez niniejszego użytkownika |
[C++] *this » 2015-11-30 04:16:23 Witam mam problem ze zrozumieniem działania *this. Mam napisać funkcję cytuję " Zaimplementuj ją przy użyciu nowego konstruktora ( na przykład pozyskane interaktywnie dane przekaż do wywołania konstruktora tworzącego obiekt tymczasowy i przypisz ten obiekt do obiektu wywołującego *this)" Moja funkcja jak dotąd wygląda tak: void setgolf() { char text[ Len ]; int w; cout << "Podaj nazwe gracza: " << endl; cin.getline( text, Len ); cout << "Podaj jego wynik: " << endl; cin >> w; Golf G( text, w ); }
Jak teraz mam obiekt G przypisać do obiektu wywołującego? Cała definicja klasy #include<iostream> #include<string.h> using namespace std; const int Len = 30; class Golf { char fullname[ Len ]; int handicap; public: Golf( const char * name = "Nazwa", int hc = 0 ) { strcpy( fullname, name ); handicap = hc; } void setgolf() { char text[ Len ]; int w; cout << "Podaj nazwe gracza: " << endl; cin.getline( text, Len ); cout << "Podaj jego wynik: " << endl; cin >> w; Golf G( text, w ); } void showgolf() { cout << "Gracz: " << fullname << endl; cout << "Wynik: " << handicap << endl; } };
|
|
carlosmay |
» 2015-11-30 06:32:00 Wskaźnik this jest tworzony dla obiektu wywołującego metodę. Klasa biekt; obiekt.aktualizuj(); Klasa obiekt2( obiekt );
void Klasa::aktualizuj() { this->skladowa1 = wartosc; this->skladowa2 = wartosc2; }
Klasa::Klasa( const Klasa & kl ) { this->skladowa1 = kl.skladowa1; this->skladowa2 = kl.skladowa2; }
this można pisać w bardziej rozbudowanych metodach dla podkreślenia obiektu niejawnie przekazywanego, oraz do zwracania obiektu z metody. |
|
mateczek |
» 2015-11-30 08:36:41 porównam ze stylem programowania C struct jakisTyp { int skladnik; } func( jakisTyp * thi_s ) { thi_s->skladnik = 5 }
int main() { jakisTyp * obiekt = new jakisTyp; func( obiekt ); }
a teraz tak jak się to robi w c++ struct jakisTyp { int skladnik; func(); } jakisTyp::func() { this->skladnik = 5 }
int main() { jakisTyp * obiekt = new jakisTyp; obiekt->func(); }
Inaczej - Z innej beczki !!! func( obiekt )
obiekt.func()
|
|
mateczek |
» 2015-11-30 09:05:45 "Jak teraz mam obiekt G przypisać do obiektu wywołującego?"
" Zaimplementuj ją przy użyciu nowego konstruktora ( na przykład pozyskane interaktywnie dane przekaż do wywołania konstruktora tworzącego obiekt tymczasowy i przypisz ten obiekt do obiektu wywołującego *this)"
| Mógłbyś wyjaśnić co ma się stać?? bo ja tego nie rozumię!!! Jeśli masz przypisać jakieś składniki (pobrane z klawiatury) do obiektu na rzecz którego działa funkcja- to zrób tak: void setgolf() { char text[ Len ]; int w; cout << "Podaj nazwe gracza: " << endl; cin.getline( text, Len ); cout << "Podaj jego wynik: " << endl; cin >> w; Golf G( text, w ); strcpy( text, name ); handicap = w; }
|
|
pepe450 Temat założony przez niniejszego użytkownika |
» 2015-11-30 10:36:01 Zadanie polega na zastąpieniu starego programu działającego na strukturze na działania w klasie. Polecenie: Funkcję setgolf(golf &,const char*,int) zastąp konstruktorem z odpowiednią listą parametrów. Zachowaj w postaci metody interaktywną wersję setgolf(), ale zaimplementuj ją przy użyciu nowego konstruktora (na przykład pozyskane interaktywne dane przekaż do wywołania konstruktora tworzącego obiekt tymczasowy i przypisz ten obiekt do obiektu wywołującego *this). Czyli zapis handicap = w; i this->handicap = w; jest zawsze równoważne? Co do zastosowań this to wiem że bardziej sensowne jest wykorzystanie do porównania wartości rożnych obiektów. I potem zwrotu obiektu o który nam chodzi. W tym przykładzie z zadania nie widzę jakiegoś sensu wykorzystania. Czy taka funkcja spełnia w takim razie te kryteria? void setgolf() { char text[ Len ]; int w; cout << "Podaj nazwe gracza: " << endl; cin.getline( text, Len ); cout << "Podaj jego wynik: " << endl; cin >> w; Golf G( text, w ); strcpy( fullname, text ); handicap = w; }
Oraz takie wywołąnie. |
|
mateczek |
» 2015-11-30 10:51:21 Czyli zapis handicap = w; i this->handicap = w; jest zawsze równoważne? |
zawsze nie ale w większości wypadków !!! func() { int handicap; this->handicap = w; handicap = 8; }
to jest trochę bez sensu :P |
|
Monika90 |
» 2015-11-30 13:36:46 W zadaniu chodzi o ty by skorzystać z czegoś takiego * this = Golf( text, w );
|
|
mateczek |
» 2015-11-30 17:11:22 Ze względu na stringcopy chyba nie pójdzie bez operatora przypisania?? |
|
« 1 » 2 |