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

C++ konstruktor kopiujący problem

Object Storage Arubacloud
0 głosów
422 wizyt
pytanie zadane 28 kwietnia 2018 w C i C++ przez konu33 Nowicjusz (210 p.)
edycja 28 kwietnia 2018 przez adrian17

Problem mój polega na tym ,że w dalszej części zadania podczas zmieniania imienia powinno się ono zmieniać tylko w jednym przypadku, a w 2 innych zostać bez zmian a u mnie zmienia się wszędzie ;/

 

#include<iostream>
#include<string.h>
#include<stdio.h>
#include <cstring>

using namespace std;

class Osoba
{
private:
     char* imie;
    char* nazwisko;
    int wiek;
public:
    Osoba(char* _imie, char* nazwisko, int wiek)
    {
        this->imie = imie;
        this->nazwisko = nazwisko;
        this->wiek = wiek;
    }

    Osoba(const Osoba&a)
    {
        this->imie = a.imie;
        this->nazwisko = a.nazwisko;
        this->wiek = a.wiek;
    }

    void pokaz_opis()
    {
        cout <<"Imie:"<< imie << endl;
        cout <<"Nazwisko:"<< nazwisko << endl;
        cout <<"Wiek:"<< wiek << endl;
    }
    void zmien_imie(char* imie1)
    {
        imie = imie1;
    }
    ~Osoba() {}
};
int main()
{
    char imie[10];
    char nazwisko[15];
    int wiek;

    cout << "Podaj imie:" << endl;
    cin >> imie;
    cout << "Podaj nazwisko:" << endl;
    cin >> nazwisko;
    cout << "Podaj wiek:" << endl;
    cin >> wiek;

    Osoba x(imie, nazwisko, wiek);
    Osoba y=x;

    cout << "Podaj imie do zmiany:" << endl;
    cin >> imie;
    y.zmien_imie(imie);
    x.pokaz_opis();
    y.pokaz_opis();

    cout << "Sie skopiowalo troche" << endl;

    cout << "Dalsza czesc zadania:" << endl;
;
    Osoba q(imie, nazwisko, wiek);
    Osoba w(imie,nazwisko,wiek);
    Osoba e(q);
    cout << endl;
    cout << endl;
    q.pokaz_opis();
    w.pokaz_opis();
    e.pokaz_opis();
    cout << "Podaj imie do zmiany:" << endl;
    cin >> imie;
    w.zmien_imie(imie);
    q.pokaz_opis();
    w.pokaz_opis();
    e.pokaz_opis();
    
    cout << "Podaj imie do zmiany:" << endl;
    cin >> imie;
    e.zmien_imie(imie);
    q.pokaz_opis();
    w.pokaz_opis();
    e.pokaz_opis();
    system("pause");
}

 

1 odpowiedź

+2 głosów
odpowiedź 28 kwietnia 2018 przez adrian17 Ekspert (344,860 p.)
wybrane 28 kwietnia 2018 przez konu33
 
Najlepsza
class Osoba
{
private:
    char* imie;
    char* nazwisko;
    int wiek;
}
...
int main()
{
    char imie[10];
    char nazwisko[15];
    int wiek;

Twoje obiekty mają jako pola jedynie wskaźniki na `imie` i `nazwisko`. Jeśli zmienisz zawartość tablic przez `cin >> imie`, wszystkie obiekty które wskazują na tą zmienną (w Twoim przypadku, wszystkie) będą "miały" nową wartość.

Jeśli chcesz, żeby obiekt miał "własne" imię i nazwisko, możesz:

- (najbardziej c++owo) użyć std::string:

class Osoba
{
private:
    std::string imie;
    std::string nazwisko;
    int wiek;

- wciąż używać wskażników, ale upewniać się że wskazują na "własny" bufor (ale to znacznie gorsze i bliższe C):

class Osoba
{
private:
    char* imie;
    char* nazwisko;
    int wiek;
public:
    Osoba(char* _imie, char* nazwisko, int wiek)
    {
        this->imie = new char[10];
        strcpy(this->imie, _imie);
        //...
    }
    ~Osoba()
    {
        delete this->imie;
        //...
    }

- ew trzymać bufor w samym obiekcie (nawet w C dość rzadko używane):

class Osoba
{
private:
    char imie[10];
    char nazwisko[15];
    int wiek;
public:
    Osoba(char* _imie, char* nazwisko, int wiek)
    {
        strcpy(this->imie, _imie);
        //...

 

Podobne pytania

–1 głos
1 odpowiedź 807 wizyt
+1 głos
3 odpowiedzi 560 wizyt
0 głosów
2 odpowiedzi 688 wizyt

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 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!

...