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

Obiekty, *this

Object Storage Arubacloud
0 głosów
119 wizyt
pytanie zadane 10 marca 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

Cześć, 

za zadanie mam:

  1. Mam stworzyć metodę zwracającą referencję do obiektu, który jest w niej wcześniej inicjalizowany 'interaktywnie'
  2. Napisać odpowiedni konstruktor przyjmujący referencję do obiektu jako argument 
  3. Przypisać do nowego obiektu(za pomocą konstruktora)  wartość zwracaną z metody wywołanej dla poprzedniego obiektu. 

Program wysypuje się po wprowadzeniu wartości, gdzie jest błąd?

Program podzieliłem na 3 pliki (1.nagłówkowy,2.z definicjami, 3.Z funkcją 'main' )

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
#include <cstring>

class Golf
{
private:
    static const int Len = 40;
    char fullname[Len];
    int handicap;

public:
    Golf( int b = 0, const char * a ="default");
    Golf & setgolf();
    Golf(Golf&);
    void show() {std::cout<<handicap<<std::endl; std::cout<<fullname;}

};

#endif // CLASS_H_INCLUDED
#include <iostream>
#include "class.h"
using namespace std;

 Golf & Golf::setgolf()
{
    Golf a;
    cout << "Podaj wartosc int : ";
    cin>>a.handicap;
    cout << endl;
    cout << "Podaj wartosc char: ";
    cin>>a.fullname;
    return a;

}
Golf::Golf( int b,const char * a )
{
    strcpy(fullname, a);
    handicap = b;

}
Golf::Golf(Golf & a)
{
    strcpy(this->fullname, fullname);
    this->handicap = a.handicap;

}
#include <iostream>
#include "class.h"
using namespace std;






int main()
{
Golf b;
Golf c (b.setgolf());
c.show();

    return 0;
}

Zadanie pochodzi z książki "Szkoła programowania", Stephen'a Prata. 

1 odpowiedź

+1 głos
odpowiedź 10 marca 2020 przez tangarr Mędrzec (154,860 p.)
Zmienna a w funkcji Golf & Golf::setgolf() jest zmienną lokalną.
Po wyjściu z funkcji ta zmienna jest niszczona a zwrócona referencja wskazuje na niewłaściwe miejsce w pamięci.
komentarz 10 marca 2020 przez amtrax Dyskutant (9,630 p.)

Bardzo dziękuje, dodanie static  do Golf a podziałało.
Pytanie 1. Na początku myślałem, że winę ponosi wskaźnik this. Dlaczego program odrzucał  zapisanie go w postaci z wyłuskaniem (*this)? 
Pytanie 2. Dlaczego dla dowolnej wartosci char która wpisze, na wyjście zawsze pojawi się ten sam inny ciąg znaków(w stosunku do wpisanej wartości )? 

komentarz 10 marca 2020 przez tangarr Mędrzec (154,860 p.)
Brakuje mi kontekstu, żeby zrozumieć te pytania. Daj jakieś przykłady żebym miał punkt zaczepienia.
komentarz 10 marca 2020 przez amtrax Dyskutant (9,630 p.)
strcpy(this->fullname, fullname);
    this->handicap = a.handicap;

Dlaczego tutaj nie może być  *this? Odwołuje się przecież nie do adresów, ale wartości 'wyłuskanych'.
Kiedy uruchomię program,  to za pomocą metody show,program pokazuje wartości przypisane wcześniej do obiektu. Wartość int jest poprawnie wyświetlana, przy czym dla char (niezależnie co wpisze), pokazywany jest inny 'dziwny' ciąg znaków 

komentarz 10 marca 2020 przez tangarr Mędrzec (154,860 p.)

this->fullname i fullname to ta sama zmienna

strcpy(this->fullname, a.fullname);
this->handicap = a.handicap;

Nie wiem gdzie (i po co) chcesz wcisnąć *this

Podobne pytania

0 głosów
4 odpowiedzi 235 wizyt
pytanie zadane 22 kwietnia 2016 w Java przez KamilloPL Gaduła (3,470 p.)
0 głosów
0 odpowiedzi 215 wizyt
pytanie zadane 13 marca 2016 w JavaScript przez Wirus Stary wyjadacz (14,000 p.)
0 głosów
0 odpowiedzi 508 wizyt

92,632 zapytań

141,502 odpowiedzi

319,882 komentarzy

62,015 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!

...