pobieranie wartości z jednej klasy do drugiej
-
- Serdeczny Borsuk
- Posty: 123
- Rejestracja: 19 maja 2010, 19:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
- Architektura: x86
pobieranie wartości z jednej klasy do drugiej
Witam!
Załóżmy że mamy dwie klasy A i B. Na początku wywoływana jest obiekt klasy A, a następnie obiekt klasy B. Teraz obiekt klasy B chce pobrać wartość zmiennej a znajdującej się w klasie A. Czy jest możliwe pobranie tej wartości bez tworzenia nowego obiektu A w klasie B?(chodzi mi o coś takiego żeby można było bezpośrednio pobrać wartość z klasy)Mam nadzieję że w miarę zrozumiale opisane.
Załóżmy że mamy dwie klasy A i B. Na początku wywoływana jest obiekt klasy A, a następnie obiekt klasy B. Teraz obiekt klasy B chce pobrać wartość zmiennej a znajdującej się w klasie A. Czy jest możliwe pobranie tej wartości bez tworzenia nowego obiektu A w klasie B?(chodzi mi o coś takiego żeby można było bezpośrednio pobrać wartość z klasy)Mam nadzieję że w miarę zrozumiale opisane.
-
- Piegowaty Guziec
- Posty: 21
- Rejestracja: 20 lut 2011, 21:47
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.10
- Środowisko graficzne: GNOME
- Architektura: x86
- Lokalizacja: Iława
- Kontakt:
Odp: pobieranie wartości z jednej klasy do drugiej
Jeżeli wartość w klasie A nie jest statyczna, to utworzenie nowego obiektu w klasie B nic Ci nie da. Każda kolejna instancja obiektu ma własny zestaw wartości niezależny od pozostałych instancji tej samej klasy.
jednym ze sposobów na rozwiązanie Twojego problemu jest przekazanie obiektu klasy A do obiektu klasy B (może być podczas jego tworzenia [klasa C w przykładzie], ale można także w jakiejś metodzie odczytującej wartość [klasa B w przykładzie]). W ten sposób ma on dostęp do tego obiektu i może korzystać z jego publicznych metod.
Pseudokod:
jednym ze sposobów na rozwiązanie Twojego problemu jest przekazanie obiektu klasy A do obiektu klasy B (może być podczas jego tworzenia [klasa C w przykładzie], ale można także w jakiejś metodzie odczytującej wartość [klasa B w przykładzie]). W ten sposób ma on dostęp do tego obiektu i może korzystać z jego publicznych metod.
Pseudokod:
Kod: Zaznacz cały
class A
{
private int foo;
public A()
{
foo = 1;
}
public int getFoo()
{
return foo;
}
}
class B
{
private int fooFromA;
public void readFoo(A object)
{
fooFromA = object.getFoo();
}
}
class C
{
private int fooFromA;
private A fooSource;
public C(A object)
{
fooSource = object;
}
public void readFoo()
{
fooFromA = fooSource.getFoo();
}
}
A first = new A();
B second = new B();
second.readFoo(first);
C third = new C(first);
third.readFoo();
- TomaszO
- Sędziwy Jeż
- Posty: 61
- Rejestracja: 30 paź 2009, 12:47
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: pobieranie wartości z jednej klasy do drugiej
Tez kiedys nad tym sidzialem. Poradzono mi zebym zadeklarowac zmienna globalna, i do niej przypisywac wartosci.
- pax0r
- Sędziwy Jeż
- Posty: 70
- Rejestracja: 10 lut 2011, 14:18
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: pobieranie wartości z jednej klasy do drugiej
zmienne globalne to najgorsze co mozna wymyslec
a ich uzycie zaprzecza logice programowania obiektowego
opisz może dokładnie o co chodzi w tym konkretnym przypadku, ale wydaje mi sie ze rozwiazanie VGT to jest to czego potrzebujesz

a ich uzycie zaprzecza logice programowania obiektowego
opisz może dokładnie o co chodzi w tym konkretnym przypadku, ale wydaje mi sie ze rozwiazanie VGT to jest to czego potrzebujesz
-
- Serdeczny Borsuk
- Posty: 123
- Rejestracja: 19 maja 2010, 19:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: pobieranie wartości z jednej klasy do drugiej
chyba jednak nie bo to jest sytuacja gdy mamy klase C i w niej tworzymy obiekty(czyli sytuacja A<-C->B) a mi raczej chodzi o C->A->B
-
- Piegowaty Guziec
- Posty: 21
- Rejestracja: 20 lut 2011, 21:47
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.10
- Środowisko graficzne: GNOME
- Architektura: x86
- Lokalizacja: Iława
- Kontakt:
Odp: pobieranie wartości z jednej klasy do drugiej
Klasy B i C dodałem jako równoległe przykłady dwóch sposobów rozwiązania problemu (patrz opis nad kodem).
Patrz na to tak jakby były tylko klasy A i B jednym przypadku, lub klasy A, i C w drugim.
PS. I zgadzam się z pax0r w kwestii zmiennych globalnych. Są oczywiście akceptowalne zastosowania nawet w programowaniu obiektowym (choćby nadużywanie w tym celu singleton'a z przechowywaniem wartości, coby wciąż było "ładnie, zgrabnie i obiektowo"
). Jednak w sytuacji, gdy dwa obiekty maja wymieniać się danymi, to w tym przypadku zmienne globalne nie są zbyt dobrym rozwiązaniem.
PS2. Mogę jeszcze zaprezentować trzecie rozwiązanie, które być może Ci podpasuje:
Jeżeli dwa obiekty mają współdzielić jakieś dane, tworzy się dodatkowy obiekt, który służy tylko do komunikacji (współdzielenia danych) między obiektami klas A i B.
Pseudokod:
W tym przypadku obydwa obiekty wspoldziela dodatkowy obiekt, w ktorym przechowuja dane. Jesli "first" zapisze cos w "localData.foo", "second" od razu widzi tam nowe dane.
Jedyna różnica od wcześniejszych jest taka, że jest to komunikacja dwustronna. Ty potrzebujesz jednostronnej, dlatego najpierw podałem tylko to, co w moim pierwszym poście.
Patrz na to tak jakby były tylko klasy A i B jednym przypadku, lub klasy A, i C w drugim.
PS. I zgadzam się z pax0r w kwestii zmiennych globalnych. Są oczywiście akceptowalne zastosowania nawet w programowaniu obiektowym (choćby nadużywanie w tym celu singleton'a z przechowywaniem wartości, coby wciąż było "ładnie, zgrabnie i obiektowo"

PS2. Mogę jeszcze zaprezentować trzecie rozwiązanie, które być może Ci podpasuje:
Jeżeli dwa obiekty mają współdzielić jakieś dane, tworzy się dodatkowy obiekt, który służy tylko do komunikacji (współdzielenia danych) między obiektami klas A i B.
Pseudokod:
Kod: Zaznacz cały
class ABData
{
public int foo;
}
class A
{
private ABData localData;
public A(ABData data)
{
localData = data;
}
public int getFoo()
{
return localData.foo;
}
public void setFoo(int value)
{
localData.foo = value;
}
}
class B
{
private ABData localData;
public B(ABData data)
{
localData = data;
}
public int getFoo()
{
return localData.foo;
}
public void setFoo(int value)
{
localData.foo = value;
}
}
ABData objectsData = new ABData();
A first = new A(objectsData);
B second = new B(objectsData);
Jedyna różnica od wcześniejszych jest taka, że jest to komunikacja dwustronna. Ty potrzebujesz jednostronnej, dlatego najpierw podałem tylko to, co w moim pierwszym poście.
-
- Serdeczny Borsuk
- Posty: 123
- Rejestracja: 19 maja 2010, 19:50
- Płeć: Mężczyzna
- Wersja Ubuntu: 8.04
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: pobieranie wartości z jednej klasy do drugiej
ok przemyśle to , Dzięki
-
- Sędziwy Jeż
- Posty: 77
- Rejestracja: 06 sty 2009, 10:59
- Płeć: Mężczyzna
- Wersja Ubuntu: 9.10
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: pobieranie wartości z jednej klasy do drugiej
Utworz klase A jako singleton - w ten sposob bedzie mozliwe utworzenie tylko jednej instancji tej klasy. Przyklad:
Trzeba jeszcze zdefiniowac zmienna statyczna, zeby linker sie nie plul:
Teraz przyklad uzycia:
Kod: Zaznacz cały
class A
{
private:
static A *instance;
int zmienna;
A() {};
~A() {};
public:
static A& getInstance();
int getZmienna() { return zmienna; }
void setZmienna(int a) { zmienna = a; }
};
A& A::getInstance()
{
if (!instance) {
instance = new A();
}
return *instance;
}
Trzeba jeszcze zdefiniowac zmienna statyczna, zeby linker sie nie plul:
Kod: Zaznacz cały
A* A::instance = NULL;
Kod: Zaznacz cały
class B
{
public:
B() {} ;
~B() {} ;
void info() { A &instA = A::getInstance(); std::cout << "Zmienna: [" << instA.getZmienna() << "]" << std::endl; }
};
int main()
{
A &instancjaA = A::getInstance();
instancjaA.setZmienna(10);
B instancjaB;
instancjaB.info(); // zwroci "Zmienna: [10]"
}
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości