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

C++ konstruktor kopiujący problem

Cloud VPS
0 głosów
469 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 Mentor (354,120 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ź 962 wizyt
+1 głos
3 odpowiedzi 697 wizyt
0 głosów
2 odpowiedzi 761 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 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

Kursy INF.02 i INF.03
...