Strona 1 z 1

pobieranie wartości z jednej klasy do drugiej

: 04 mar 2011, 21:55
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.

Odp: pobieranie wartości z jednej klasy do drugiej

: 04 mar 2011, 22:55
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();

Odp: pobieranie wartości z jednej klasy do drugiej

: 05 mar 2011, 08:14
autor: TomaszO
Tez kiedys nad tym sidzialem. Poradzono mi zebym zadeklarowac zmienna globalna, i do niej przypisywac wartosci.

Odp: pobieranie wartości z jednej klasy do drugiej

: 05 mar 2011, 09:55
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

Odp: pobieranie wartości z jednej klasy do drugiej

: 05 mar 2011, 10:21
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

Odp: pobieranie wartości z jednej klasy do drugiej

: 05 mar 2011, 12:16
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.

Odp: pobieranie wartości z jednej klasy do drugiej

: 05 mar 2011, 13:36
autor: mariusz198787
ok przemyśle to , Dzięki

Odp: pobieranie wartości z jednej klasy do drugiej

: 07 mar 2011, 11:24
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]"
}