Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] *this

Ostatnio zmodyfikowano 2015-12-05 07:28
Autor Wiadomość
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:
C/C++
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
C/C++
#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;
    }
};
P-141141
carlosmay
» 2015-11-30 06:32:00
Wskaźnik this jest tworzony dla obiektu wywołującego metodę.
C/C++
// main
Klasa biekt;
obiekt.aktualizuj();
Klasa obiekt2( obiekt );

// ....
void Klasa::aktualizuj() {
    this->skladowa1 = wartosc;
    this->skladowa2 = wartosc2;
}

// konstruktor kopiujący
Klasa::Klasa( const Klasa & kl ) {
    this->skladowa1 = kl.skladowa1; // skladowa1 = kl.skladowa1;
    this->skladowa2 = kl.skladowa2; // obecnie dodawanie this jest sztuka dla sztuki
}
this można pisać w bardziej rozbudowanych metodach dla podkreślenia obiektu niejawnie przekazywanego, oraz do zwracania obiektu z metody.
P-141142
mateczek
» 2015-11-30 08:36:41
porównam ze stylem programowania C

C/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++
C/C++
struct jakisTyp {
    int skladnik;
    //[..]
    func();
}
jakisTyp::func() {
    this->skladnik = 5
}

int main() {
    jakisTyp * obiekt = new jakisTyp;
    obiekt->func();
}

//ponieważ funkcja func() jest jedna - pomimo kilku instancji obiektu jakisTyp. Funkca musi wiedzieć na rzecz jakiego obiektu została wywołana !!!
//do tego służy właśnie składnik "this". W przypadku wywołania obiekt->func(); "this" wewnątrz funkcji "fun()" pokazuje na "obiekt" !!!

Inaczej - Z innej beczki !!!

C/C++
//w klasycznym c było:
func( obiekt ) //"obiekt" jest przekazywany do funkcji jawnie !!!
//w c++
obiekt.func() //"obiekt" przekazywany jest do funkcji za pomocą wskaźnika "this"
P-141146
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:

C/C++
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 );
    //przypianie danych z klawiatury do obiektu (*this) :P jeśli o to chodziło :P
    strcpy( text, name );
    handicap = w;
    //this->handicap = w;// można użyć wskaźnika "this" ale on jest domyślny
    //this*=G  //ale nie wiem czy Ci tak pójdzie bez operatora przypisania !!!
   
}
P-141148
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?
C/C++
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.
C/C++
Golf o3;
o3.setgolf();
P-141152
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 !!!
C/C++
func() {
    int handicap; //zmienna tymczasowa
    this->handicap = w; // zapis do składnika klasy !!!
    handicap = 8; //zapis do zmiennej tymczasowej
   
}


to jest trochę bez sensu :P
C/C++
Golf G( text, w );


C/C++
// tak zadziała !!! pytanie czy czasami autor zadania nie chciał by zapytania o dane były w konstruktorze!!! musisz się dopytać !!!
Golf o3;
o3.setgolf();
P-141155
Monika90
» 2015-11-30 13:36:46
W zadaniu chodzi o ty by skorzystać z czegoś takiego
C/C++
* this = Golf( text, w );
P-141164
mateczek
» 2015-11-30 17:11:22
Ze względu na stringcopy chyba nie pójdzie bez operatora przypisania??
P-141180
« 1 » 2
  Strona 1 z 2 Następna strona