Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

inicjalizacja obiektu w innej klasie przez zmianę wartości pola klasy

Ostatnio zmodyfikowano 2018-09-12 20:29
Autor Wiadomość
fisker
Temat założony przez niniejszego użytkownika
inicjalizacja obiektu w innej klasie przez zmianę wartości pola klasy
» 2018-09-11 19:13:10
Mam taki kod c++
C/C++
#include <iostream>

using namespace std;
class p0
{
    int a0;
    int b0;
   
public:
    p0( int aa0 = 0, int bb0 = 5 )
    {
        a0 = aa0;
        b0 = bb0;
    }
    void wypisz()
    {
        cout << "a0= " << a0 << endl;
        cout << "b0= " << b0 << endl;
    }
   
};
class p1
{
    int b = 2; // to działa w p0 a
   
public:
    p1( int bb = 7 ) { b = bb; } // a to już nie
    p0 a {( 2 + b ),( 5 + b ) }; /// obiekt klasy p0 z inicjalizacją
   
    void zmien_b()
    {
        cout << "podaj b";
        cin >> b;
    }
    void wy()
    {
        a.wypisz();
        cout << "b= " << b << endl;
    }
};

int main()
{
    cout << "Hello world!" << endl;
    p1 d;
    d.wy();
    d.zmien_b();
    d.wy();
   
    p1 e( 3 );
    e.wy();
    return 0;
}
chciałbym przez zmianę wartości pola "b" klasy p1 zmienić wartość obiektu "a" w klasie p1. i zmieniać dowolnie dla obiektu d w main() przez funkcję zmiez_b
P-172294
jankowalski25
» 2018-09-11 21:15:26
» Kurs C++ / FAQNajczęściej spotykane bugi pytanie/odpowiedźZmienne przechowują wartości. Nie wyrażenia!
To samo dotyczy klas. Pola w klasie przechowują wartości, a nie wyrażenia.
P-172295
fisker
Temat założony przez niniejszego użytkownika
» 2018-09-12 00:49:55
  int b <- chodzi mi by dobrać się do adresu komórki pola klasy p1 przez jakiś seter by w main()nie tworzyć obiektów i ich nie kasować (new , delete)

C/C++
public:
//p1 ( int bb=7) { b=bb;}
p1( int bb = 7 )
    : b( bb )
{; } /// przy takim konstruktorze mogę zmienić w main() ale tylko raz przy inializacji obiektu
p0 a {( 2 + b ),( 5 + b ) }; /// obiekt klasy p0 z inicjalizacją
p0 aa {( 2 + b * b ),( 5 + b + b ) };
p0 aaa {( 2 + b * b * b ),( 5 + b + b + b ) };

..............
C/C++
int main()
{
    p1 d( 50 ); // tylko mogę podać wartość w nawiasie tylko przy tworzeniu obiektu
    d.wy();
    d.zmien_b();
    d.wy();
   
    p1 e( 3 );
    e.wy();
    return 0;
}
wyświetla :
a0= 52
b0= 55
a0= 2502
b0= 105
a0= 125002
b0= 155
b= 50 // tu nic nie zmieniło
podaj b15
a0= 52
b0= 55
a0= 2502
b0= 105
a0= 125002
b0= 155
b= 15
a0= 5 // nowy obiekt tu już tak
b0= 8
a0= 11
b0= 11
a0= 29
b0= 14
b= 3
P-172296
pekfos
» 2018-09-12 20:17:55
b= 50 // tu nic nie zmieniło
A czemu miałoby coś się tu zmieniać..?
P-172298
jankowalski25
» 2018-09-12 20:29:26
chodzi mi by dobrać się do adresu komórki pola klasy p1 przez jakiś seter
Zakładając, że możesz zmieniać kod klasy p0, to najprościej byłoby dołożyć publiczne gettery/settery i je po prostu wywoływać. Gołych adresów bym raczej nie tykał, bo to dość brzydkie rozwiązanie i wtedy nie masz żadnej warstwy kontrolującej pobieranie i edycję składowych, a same wartości surowych wskaźników dość łatwo wymykają się spod kontroli.

Jeśli natomiast kod tych getterów/setterów jest trywialny, to same typy można nawet upublicznić i opakować szablonami, na przykład jakoś tak:
C/C++
class p0
{
public:
    property < int > a0;
    property < int > b0;
};
W tym przypadku
property < T >
 będzie własnym szablonem z przeciążoną metodą
operator =
 jako setter oraz z metodą
operator T()
 jako getter. W razie potrzeby zmiany działania domyślnych setterów/getterów można dziedziczyć na przykład po
property < int >
 i tam podmienić implementację.
P-172299
« 1 »
  Strona 1 z 1