• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dynamiczne obiekty, klasy, problem z czytaniem wskaznika

Object Storage Arubacloud
0 głosów
207 wizyt
pytanie zadane 13 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)

Mam taki kod:

#include <iostream>

using namespace std;

class Rectangle
{
    int width, height;
public:
    void set_values(int a, int b)
    {
        width = a;
        height = b;
    }
    int area (void) {return (width * height);}

};

int main()
{
    Rectangle a, *b, *c;
    Rectangle * d = new Rectangle[2];
    b = new Rectangle;
    c = &a;
    a.set_values(1,2);
    cout << c << endl;
}

Mam pytanie jesli ustawiam na wskaznik c, adres zmiennej a

i przypisuje do a wartosci 1,2

chcac przeczytac cout << c << endl; wyskakuje mi adres szufladki c

a chcac zrobic cout << *c << endl

wyskakuje blad

D:\133\main.cpp|25|error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'Rectangle')|

 

Czemu tak?

2 odpowiedzi

0 głosów
odpowiedź 13 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 13 lutego 2016 przez Ziuziek
 
Najlepsza
Przecież nie da się wypisać całego obiektu - musisz wyjąć z niego odpowiednią składową i dopiero powinno zadziałać.
komentarz 13 lutego 2016 przez Ziuziek Mądrala (5,140 p.)
#include <iostream>

using namespace std;

class Rectangle
{
public:
    int width, height;

    void set_values(int a, int b)
    {
        width = a;
        height = b;
    }
    int area (void) {return (width * height);}

};

int main()
{
    Rectangle a, *b, *c;
    Rectangle * d = new Rectangle[2];
    b = new Rectangle;
    c = &a;
    a.set_values(1,2);
    cout << c->width << endl;
}

 

OK dziala czyli wyciagajac zmienne operujac na wskaznikach zawsze musze sie poslugiwac -> tak?

komentarz 13 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

Nie, masz jeszcze drugi sposób, który jest równoważny z pierwszym:

std::cout << (*c).width << std::endl;

 

komentarz 13 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

1. Czym sie rozni i któro lepsze wykorzystanie?

b.set_values(3,4);
lub
b->set_values(3,4);
    

2. Dobrze to rozumuje?

    Rectangle * d = new Rectangle[2];    //stworzenie tablicy dynamicznej Rectangle 2 elementowej
    d->set_values(5,6); // wywolanie metody na rzecz dynamicznej tablicy d (ustawienie wartosci w szufladce z numerem 0
    d[1].set_values(7,8); // wywolanie metody na rzecz dynamicznej tablicy d(ustawienie wartosci w szufladce z numerem 1

 

3. Jaka jest roznica pomiedzy: i jakie jest zastosowanie tego w praktyce?


    b = new Rectangle; // stworzony obiekt dynamicznie

     b->set_values(3,4);

pomiędzy:

b = Rectangle;

b.set_values(3,4);

 

Prosilbym o wasze zdanie

komentarz 13 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
  1. Pierwsze rozwiązanie wykorzystujesz przy obiektach, drugie przy wskaźnikach na obiekty.
  2. Tak, dobrze rozumujesz, ponieważ nazwa tablicy to wskaźnik na jej pierwszy element i jest punktem odniesienia do reszty elementów - aby dostać się do pozostałych, należy wykorzystać arytmetykę wskaźników, która dla każdego typu jest inna (jeśli dany typ mieści się w różnej ilości bajtów). Takową arytmetykę możesz użyć na dwa sposoby: dzięki operatorowi * oraz []:
    int tablica[3];
    // Oba zapisy są sobie równoważne
    *(tablica + 1) = 4;
    tablica[1] = 4;
    
  3. W pierwszym przypadku deklarujesz dynamiczną zmienną, tzn., że będziesz mógł ją sam usunąć (zwolnić pamięć), gdy nie będzie ci ona potrzebna - efektem ubocznym będzie jedynie wskaźnik, który oczywiście możesz wykorzystać wielokrotnie. W drugim deklarujesz zmienną statyczną, tzn., że nie będziesz miał możliwości usunięcia jej samodzielnie (zostanie usunięta, gdy program wyjdzie z danego obszaru, czyli np. z funkcji - nie zostanie, gdy będzie globalna). Warto pamiętać, że dane dynamiczne nie są usuwane po wyjściu z obszaru, w którym zostały zadeklarowane - musisz je usunąć ręcznie.
0 głosów
odpowiedź 13 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

Kod:

#include <iostream>

using namespace std;

class Rectangle
{
    int a,b;
public:
    int width, height;
    Rectangle(int _a = 1, int _b = 2)
    {
        a = _a;
        b = _b;
    }
    void set_values(int a, int b)
    {
        width = a;
        height = b;
    }
    int area (void)
    {
        return (width * height);
    }
    Rectangle(const Rectangle &kopia)
    {
        width = kopia.width;
        height = kopia.height;
    }
};

int main()
{
    Rectangle a;   // utworzenie obiektu a
    a.set_values(2,3); //wywolanie metody ustawienia
    cout << a.area() << endl; 
    Rectangle b(a); //skopiowanie obiektu a do b
    cout << b.area() << endl; 
    Rectangle kopia(5,52); //<< o co tutaj chodzi i czemu
    cout << kopia.area() << endl; //nie wyswietla tu wyniku << tylko 0
    cout << b.area() << endl;
    return 0;
}

Czy dobrze opisalem w komentarzach w kodzie??

I jezeli mozna kopiowac obiekty w mainie to po co konstuktor kopiujacy w klasie i po co on?

Podobne pytania

0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 10 lutego 2016 w C i C++ przez luparuwka Początkujący (400 p.)
0 głosów
1 odpowiedź 130 wizyt
pytanie zadane 13 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
1 odpowiedź 343 wizyt
pytanie zadane 25 kwietnia 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)

92,555 zapytań

141,404 odpowiedzi

319,558 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...