przekazywanie danych z klasy do klasy

0

Witam,
mam takie pytanko:
Stworzyłem sobie dwie klasy powiedzmy a i b. klasa b jest wewnątrz klasy a.
Proszę mi powiedzieć jak klasa a powinna wydobywać dane z klasy b? tzn. potrzebuję sięgnąć do kilku danych i je robić na nich różne operacje razem ze składnikami klasy a. Wiem, że mogę do nich sięgać np. tak:

class a
{
b obiekt;
double zmienna;

double funkcja(unsigned int i){
if(i == 1)
return zmienna+obiekt.zmienna; //tyle, że nie wiem czy nie powinno się np. używać wskaźników albo funkcji w klasie b etc?
if(i == 2)
return zmienna*obiekt.zmienna;
if(i>2)
return zmienna-obiekt.zmienna; 

chodzi mi o to jak byłoby najbardziej prawidłowo - jeśli mogę to tak ująć :)

0

poprzez np dziedziczenie można uzyskać dostęp elementów z jednej klasy w drugiej. Musisz tylko odpowiednio rozplanować swoje klasy.

 class b
{
public:
	int zmienna;
};

class a: public b
{
public:
	void SkladnikiKlasyB();
};

Jak widać w klasie b mamy zmienna typu int a w klasie a (która dziedziczy publiczne rzeczy z b) mamy tylko funkcję SkladnikiKlasyB();
Dzięki takiej operacji możemy w klasie a posługiwać się zmiennymi publicznymi z klasy b

void a::SkladnikiKlasyB()
{
	cout << zmienna << "\n";
}

Oraz przykład uzycia w mainie (stwarzam tylko klasę a bo zawiera jakby w sobie klasę b)

int main()
{
	a cA;
	cA.zmienna = 3;
	cA.SkladnikiKlasyB();

	cin.sync();
	cin.get();
	return 0;
}

Więcej info tutaj : http://lmgtfy.com/?q=dziedziczenie+c%2B%2B

0

Poczytaj o hermetyzacji. Dane skladowe klasy nie powinny byc dostepne "z zewnatrz".

Mozna utworzyc zaleznosc gdzie obiekt klasy B zawiera obiekt klasy A i operuje na jego zmiennych, ale wydaje mi sie ze prosciej bedzie tutaj wykorzystac dziedziczenie i najwyzej obiekt klasy B zainicjowac obiektem klasy A(konstruktor kopiujacy).

Ja to zrobilem troche na innej zasadzie, dane chronione sa dziedziczone do klasy nizszych i dla nich dostepne bez uzycia odpowiednich metod.

cus takiego

class A
{
protected:
    int x;
public:
    A(int x){this->x=x;}
};

class B : public A
{
private:
    int y;
public:
    int suma(){return this->x+this->y;}
    B(int x, int y) : A(x) {this->y=y;}
};

int main()
{
    B obiekt(3,5);
    cout << obiekt.suma();
    return 0;
}

ewentualnie inicjowac B obiekt(A) a potem za pomoca metody ustawic odpowiednio skladowe klasy B. Opcji jest wiele.

0

ok, dzięki za info - rzeczywiście chyba skuszę się na dziedziczenie :)
pozdrawiam

0

No dobra, a może mi ktoś doradzić jak może się to odbywać w drugą stronę - tj. żeby klasa, która jest dziedziczona przez inną klasę mogła wykorzystywać dane klasy nadrzędnej?
Czyli mamy:
Class A //w tej klasie chciałbym korzystać ze zmiennych klasy A oraz B
Class B : public A //tu również chciałbym korzystać ze zmiennych klasy A i B

0
  1. dziedziczenie tutaj to najprawdopodobniej zły pomysł. Dziedziczenie to relacja "jest typu". Jeżeli B nie jest rodzajem A to dziedziczenie tu nie pasuje.
  2. jeżeli masz taką konieczność to na 99,9% projekt jest zły i musisz zmienić koncepcję
0

Kowix, może podaj to trochę mniej abstrakcyjnie. Taka zależność między klasami jest bardzo niewskazana, już lepszym rozwiązaniem jest stworzenie jednej większej klasy, ale bez dokładnej specyfiki problemu trudno to ocenić. Może powinieneś inaczej podzielić obowiązki, np. ograniczyć powiązanie instancja klasy B -> instancji klasy A do wywoływania metod klasy A z odpowiednimi parametrami.

0

Jeżeli jednak ci potrzeba z klasy zawartej dostępu do klasy nadrzędnej, która właśnie ten obiekt zawiera, to możesz przekazać to co potrzeba w konstruktorze.

0

Ok, dzięki - już chyba zrozumiałem swój problem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1