pobieranie wartości z jednej klasy do drugiej

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
mariusz198787
Serdeczny Borsuk
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

Post autor: mariusz198787 »

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.
VGT
Piegowaty Guziec
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

Post autor: VGT »

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:

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();
Awatar użytkownika
TomaszO
Sędziwy Jeż
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

Post autor: TomaszO »

Tez kiedys nad tym sidzialem. Poradzono mi zebym zadeklarowac zmienna globalna, i do niej przypisywac wartosci.
Awatar użytkownika
pax0r
Sędziwy Jeż
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

Post autor: pax0r »

zmienne globalne to najgorsze co mozna wymyslec :P
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
mariusz198787
Serdeczny Borsuk
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

Post autor: mariusz198787 »

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
VGT
Piegowaty Guziec
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

Post autor: VGT »

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:

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);
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.
mariusz198787
Serdeczny Borsuk
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

Post autor: mariusz198787 »

ok przemyśle to , Dzięki
clansman5
Sędziwy Jeż
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

Post autor: clansman5 »

Utworz klase A jako singleton - w ten sposob bedzie mozliwe utworzenie tylko jednej instancji tej klasy. Przyklad:

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;
Teraz przyklad uzycia:

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]"
}
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości