Wskaźnik na Vektor, dlaczego trzeba użyć "this" chce to zrozumieć, prosiłbym o wytłumaczenie.

Odpowiedz Nowy wątek
2019-04-03 16:07
0
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
class person {

    typedef struct {
        int id;
        char imie[20];
        char nazwisko[20];
        int wiek;
    } tosoba;

    vector<tosoba>*osoba=new vector<tosoba>;
    int size;

public:

    person(int s) {
        size = s;
    };

    void add_person() {

        for (int i = 0; i < size; i++)
        {

            tosoba temp;

            cout << "Podaj ID: ";
            cin >> temp.id;
            cout << "Podaj imie: ";
            cin >> temp.imie;
            cout << "Podaj nazwisko: ";
            cin >> temp.nazwisko;
            cout << "Podaj wiek: ";
            cin >> temp.wiek;
            osoba->push_back(temp);          //w tym miejscu.

        }

    }

    void show_person()
    {
        for (int i = 0; i < size; i++)
        {
            tosoba temp;
            temp = osoba->at(i);                        //w tym miejscu.
            cout << temp.id << endl;
            cout << temp.imie << endl;
            cout << temp.nazwisko << endl;
            cout << temp.wiek << endl;

        }

    }

    ~person() {

        delete osoba;
    }

};

int main()
{
    int size;
    cout << "Podaj rozmiar tablicy:" << endl;
    cin >> size;

    person a(size);
    a.add_person();
    a.show_person();

    return 0;
}

Rozumiem to tak że dzięki temu metoda odnosi się do obiektu na który wskazujemy a nie wskaźnika ?

Pozostało 580 znaków

2019-04-03 16:10
1

Nie uzywaj new... poprostu zrob:

vector<tosoba> osoba;

Dzieki temu nie bedziesz musial usuwac a jak klasa umrze obiekt zostanie usuniety...

Pozostało 580 znaków

2019-04-03 16:12
0
daniel1302 napisał(a):

Nie uzywaj new... poprostu zrob:

vector<tosoba> osoba;

Dzieki temu nie bedziesz musial usuwac a jak klasa umrze obiekt zostanie usuniety...

Wiem wiem ale w zadaniu było żeby zwolnić pamięć więc wolałem zrobić tak żeby nie stracić punktów : )

Pozostało 580 znaków

2019-04-03 16:14
2

new z std::vector nie ma sensu. std::vector już w sobie zawiera wskaźnik na pamięć, którą sam automatycznie zarządza.

Jakie this? W tym kodzie nic takiego jawnie nie występuje.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2019-04-03 16:15
1

A gdzie uzywasz this, ze o niego pytasz? this to jest wlasnie wskaznik na obiekt klasy w ktorej to this uzywasz...

Jesli zrobisz:

struct SomeClass
{
    void printThis() { printf("%p", this); }
};

auto a = SomeClass{};
auto b = SomeClass{};

a.printThis();
b.printThis();

To zobaczysz, ze this w a wskazuje na adres instancji a, a this w b na adres instancji b...

Tutaj masz przyklad: https://wandbox.org/permlink/JZYItkZJAlzbzG3l

edytowany 1x, ostatnio: daniel1302, 2019-04-03 16:19

Pozostało 580 znaków

2019-04-03 16:18
0
daniel1302 napisał(a):

A gdzie uzywasz this, ze o niego pytasz? this to jest wlasnie wskaznik na obiekt klasy w ktorej to this uzywasz...

Jesli zrobisz:

struct SomeClass
{
    void printThis() { printf("%p", this); }
};

auto a = SomeClass{};
auto b = SomeClass{};

a.printThis();
b.printThis();

To zobaczysz, ze this w a wskazuje na adres instancji a, a this w b na adres instancji b...

Ok... zinterpretowałem "->" jako "this" więc ta strzałka wskazuje na metodę która się odnosi do obiektu tak ? ponieważ metoda ma się odnosić do obiektu nie wskaźnika na obietk dobrze rozumiem >

W C++ do wlasnosci obiektu mozesz odwolac sie przez "->" np xxx->metoda(); jesli xxx jest wskaznikiem. Mozesz tez odwolac sie przez xxx.metoda(); ale wtedy xxx nie moze byc wskaznikiem. A this jest wskaznikiem wiec uzywasz -> zamiast . - daniel1302 2019-04-03 16:21
Ok, czyli żeby przy wskaźniku odwołać się do struktury, metody, argumentu obiektu muszę użyć "->". Rozumiem, dziękuje za odpowiedź. - Pabloo111 2019-04-03 16:25
z wyjątkiem sytuacji przeciążenia operatora, a->b to to samo co (*a).b - Azarien 2019-04-05 17:19

Pozostało 580 znaków

2019-04-03 16:20
0
MarekR22 napisał(a):

new z std::vector nie ma sensu. std::vector już w sobie zawiera wskaźnik na pamięć, którą sam automatycznie zarządza.

Jakie this? W tym kodzie nic takiego jawnie nie występuje.

Tak jak napisałem w komentarzu powyżej, wolałem tego użyć ponieważ w treści zadania pisze żeby zwolnić pamięć więc nie chciałem żeby było się do czego doczepić.

Pozostało 580 znaków

2019-04-05 13:32
0

Klasyczny przykład użycia this

...
class Malpka {
private:
    int* a;
public:
    void someMethod(int* a);
};

void Malpka::someMethod(int* a)
{
    this->a = a;
}
...
Rozumiem, dziękuje : ) - Pabloo111 2019-04-05 14:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0