komunikacja miedzy klasowa C++

0

Witam.
Dlaczego x po wywołaniu funkcji dodaj z main'a i wyswietleniu go poprzez inna funkcje z klasy dwa nie wyswietla poprawnej wartosci? Gdzie jest przechowywany x i jak go wyswietlic po dokonaniu operacji na nim?

class jeden
{
        private:
        int x;
        public:
        jeden(){x=10;}

        int dodaj()
        {
                x=x+1;
        };

        int odejmij()
        {
                x=x-2;
        };
        int rowne_x()
        {
                return x;
        };
};

class dwa
{
        private:
        jeden obj_jeden;
        public:

        int wyswietl()
        {
                cout<<obj_jeden.rowne_x();
                getch();
        };
};

int main()
{
        jeden obj_jeden;
        dwa obj_dwa;

        obj_jeden.dodaj();
        obj_jeden.odejmij();
        obj_dwa.wyswietl();

        return 0;
}
0

To ci sie w ogóle kompiluje? Nie powinno byc srednikow po metodach dodaj,odjmij itd. W konstruktorze klasy dwa powinienes przekazac referencje do obiektu klasy jeden

0

człowieku zauważ, że masz DWA RÓŻNE obiekty klasy jeden! Jeden obiekt utworzyłeś w main obj_jeden, a drugi utworzyłeś wewnątrz zmienne obj_dwa ponieważ obj_jeden jest składnikiem klasy dwa i nie ma nic wspólnego (poza nazwą i typem) z obj_jeden utworzonym w main to jest zupełnie inna przestrzeń widoczności!
To co robisz tu:

obj_jeden.dodaj();
obj_jeden.odejmij();

nie ma najmniejszego wpływu na obj_dwa.

0

obj_jeden w main i ten w klasie dwa to zupełnie inne obiekty, każdy z nich ma swój x. Ty modyfikujesz zmienną x dla lokalnie utworzonego obiektu wewnątrz funkcji main, dlatego metoda wyswietl zwróci 10.
obj_jeden.wyswietl() da w rezultacie 9.

Jak tworzysz funkcję, która ma coś zwracać to powinna coś zwrócić(kod się nie kompiluje). W nie których przypadkach jest to bezsensu.

Możesz zrobić coś takiego, wtedy obiekt klasy dwa będzie przechowywał wskaźnik na obiekt klasy jeden. Modyfikując zmienna lokalnego obiektu będziesz to widział w rezultacie wywołania funkcji wyswietl z klasy dwa.

#include <iostream>
using namespace std;

class jeden
{
        private:
        int x;
        public:
        jeden(){x=10;}

        int dodaj()
        {
                x=x+1;
				return x;
        }

        int odejmij()
        {
                x=x-2;
				return x;
        }
        int rowne_x()
        {
                return x;
        }
};

class dwa
{
        private:
        jeden *obj_jeden;
        public:
			dwa(jeden *obj) : obj_jeden(obj) {}

        void wyswietl()
        {
                cout<<obj_jeden->rowne_x();
        }
};

int main()
{
        jeden obj_jeden;
        dwa obj_dwa(&obj_jeden);

        obj_jeden.dodaj();
        obj_jeden.odejmij();
        obj_dwa.wyswietl();

        return 0;
}
0

Dziękuje za pomoc:)

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