inicjalizacja obiektu w innej klasie przez zmianę wartości pola klasy
Ostatnio zmodyfikowano 2018-09-12 20:29
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++ #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; public: p1( int bb = 7 ) { b = bb; } p0 a {( 2 + b ),( 5 + b ) }; 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 |
|
jankowalski25 |
» 2018-09-11 21:15:26 Najczęściej spotykane bugi ♦ Zmienne przechowują wartości. Nie wyrażenia!To samo dotyczy klas. Pola w klasie przechowują wartości, a nie wyrażenia. |
|
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) public:
p1( int bb = 7 ) : b( bb ) {; } p0 a {( 2 + b ),( 5 + b ) }; p0 aa {( 2 + b * b ),( 5 + b + b ) }; p0 aaa {( 2 + b * b * b ),( 5 + b + b + b ) };
.............. int main() { p1 d( 50 ); 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 |
|
pekfos |
» 2018-09-12 20:17:55 b= 50 // tu nic nie zmieniło |
A czemu miałoby coś się tu zmieniać..? |
|
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: 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ę. |
|
« 1 » |