Przekazywanie wartości zmiennej z klasy do klas w niej zadeklarowanych

0

Witajcie

Mam dość nietypowy problem, który udało mi się częsciowo rozwiązać ale szukam rozwiązania bardziej eleganckiego. Niestety w C++ bawię się od niedawna i nie ogarnąłem wszystkiego w dostatecznym stopniu.
Poniżej podaję uproszczony przykład co chcę uzyskać.

Mianowicie, mam dwie klasy, KlasaA i KlasaB. W klasie KlasaA deklaruję zmienną "Nazwa" oraz obiekt typu KlasaB. Zadanie jest takie aby zmienna "Nazwa" była widoczna w KlasaB.
Do czego mi to potrzebne? Np żeby klasaB wiedziała do której klasy A przynależy (np po nazwie klasy A).

Moje rozwiązanie polega przez przekazanie zmiennej w konstruktorze:

class CklasaB
{
public:
	char* NazwaB;

	CklasaB(char* _nazwa)
	{
		NazwaB=_nazwa;
	};
};


class CklasaA
{
public :
	char Nazwa[20];

	CklasaB KlasaB;

	CklasaA():
		KlasaB(Nazwa)
	{};
};
 

Kłopot z tym rozwiazaniem jest taki, że jest więcej pisaniny, trzeba każdorazowo obiekt typu CklasaB dopisywać do listy przy konstruktorze klasy A oraz trzeba przekazywać parametr "Nazwa". Chciałbym tego uniknąć.

Jest jakiś sposób na to, żeby klasaB "widziała" zawartość klasy A w której jest zadeklarowana?

0

nie wiem czy dobrze rozumiem, ale moze umiesc w klasie B referencje do klasy A

class CklasaB
{
public:
       
        CKlasaA *klasaA;
 
        CklasaB( CKlasaA *parametr)
        {
                klasaA = Parametr;
        };


};
 
 
class CklasaA
{
public :
        char Nazwa[20];
 
        CklasaB KlasaB;
 
        CklasaA():
                KlasaB(this)
        {};
};
 
0

Ale to jest trochę nielogiczne. PO CO obiekt B miałby wiedzieć w jakim obiekcie A jest? Rozwiazaniem jest powiązanie obiektu B z obiektem A, ale takie rzeczy są rzadko potrzebne. Stawiam na to ze coś źle zaprojektowałeś po prostu.

0

Fakt to może się wydawać nielogiczne. Potrzebne mi jest to w dość specyficznym przypadku. Robię program który tworzy plik konfiguracyjny typu "ini". Dla przypomnienia, aby zapisac wartość do tego pliku nalezy podać sekcję, klucz oraz wartość.

Klasa A i jej podobne byłyby sekcjami. W nich znajdowałyby się dowolne ilości obiektów typu klasy B (i jej podobnych), które byłby kluczem i wartością. Każda klasa typu B posiada metodę zapisu i odczytu do pliku ini ale musi wiedzieć do jakiej przynależy sekcji. Stąd sposób przekazywania nazwy.

Rozwiazanie ma być dość elastyczne i proste w obsłudze. Po prostu w klasie A deklaruje dowolną ilość obiektów klasy B a one muszą umieć samodzielnie się odczytać i zapisać. Ideałem by była sama deklaracja obiektu B bez dodatkowej pisaniny konstuktorze itd.

0

To ja w ogóle nie rozumiem idei tych obiektów A. Czemu obiekt B po prostu nie wie do jakiej sekcji jest przypisany? Bo zrobiłeś z tego taki niby-kompozyt a to przecież nim nie jest.

0

Jeśli potrzebujesz z wnętrza klasy A mieć dostęp do prywatnej zmiennej zdefiniowanej w klasie B,to po prostu zadeklaruj przyjaźń miedzy klasą B i A,po czym odwołanie robisz:

CklasaA a;
a.internalB.nazwa=something;

ot i tyle

Ponadto jak Shalom słusznie zauważył sam projekt jest nie najszczęśliwszy.Miej sobie po prostu klasę w stylu:

class Section
{
   string sectionName;
   List<Entry> entryList;
public:
   void saveSection(const string &filename);
   void loadSection(const string &filename);
}

struct Entry
{
   string key;
   string value;
}

W sumie,to Entry mogłoby być zagnieżdżone w klasie Section,do której dodałoby się funkcję createEntry(key,value)+kilka do operowania na liście wpisów

0

wydaje mi się drogi autorze, że troszkę źle zaprojektowałeś te swoje klasy. Może stwórz trzecią klasę, która będzie "zarządcą" tamtych (?)

0

Shalom idea obiektów A jest dość prosta. Tłumacząc od końca, obiekty B są uniwersalnymi obiektami typu klucz-wartość (int,float,bool, string) które służą do przechowywania zmiennych struktury konfiguracji. Natomiast struktura konfiguracji to obiekt A.
Przy czym obiektów A moze być kilka a nie jeden, dlatego obiekty A stanowią sekcje w pliku konfiguracyjnym.

Tłumacząc to na bardzo uproszczonym wyimaginowanym przykładzie, jak chciałbyś zapisać konfigurację sdamochodu przyjmując jakiś logiczny podział :

Parametry zewnętrzne (obiekt typu A) :

  • dlugosc (obiekt B)
  • szerokosc (B)
  • kolor (B)

Parametry wewnetrze (A)

  • tapicerka (B)
  • wyposazenie (B)

Parametry mechaniczne (A)

  • silnik (B)
  • skrzynia biegow (B)

itd.

Tu parametrów jest mało i możnaby wrzucić do jednego worka bo to przykład ale u mnie będzie tych parametrów ponad 100. Ze względu na funkcjonalność będą podzielone w struktury/klasy grupujące te parametry zgodnie z jakąś logiką.

Oczywiście mógłbym każdemu obiektowy typu B przydzielać ręcznie sekcję i klucz ale myślałem, że da się to zrobić inaczej, wygodniej od strony rozbudowy, czyli deklaruję w obiekcie A dowolną ilość obiektów B a one wiedzą do którego obieku A należą.

Ok dzieki za podpowiedzi, przemyślę je i dam znać co udało mi się uzyskać.

Jak zaznaczałem na początku z klasami mam do czynienia od niedawna (sporo programowałem w C ale tylko mikrokontrolery) i ilość możliwych zastosowań klas (przyjaźnie, metody wirtualne,dziedziczenie itd) powodują, że jeszcze nie ogarniam tego w takim stopniu aby od razu w sposób oczywisty wybrać optymalne rozwiązanie do mojego problemu.

Nie wykluczam tego, że mój pomysł jest trochę bez sensu. Łatwo sie zamotać brnąc w jakąś własną idee, ktoś inny zawsze może mieć świerzy, obiektywny pogląd na pomysł. Dlatego wszelkie podpowiedzi są mile widziane :)

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