Klasy zaprzyjaźnione czy inny sposób?

0

Hej!
Mam drobne pytanie dotyczące "dobrej praktyki programowania"
Jeśli mam klasy A i B. Klasa A posiada jako jedną ze zmiennych Obiekt klasy B. Teraz mam też konstruktor klasy A, w którym chciałbym zainicjować wartości zmiennych klasy A (w tym również wartości prywatne klasy B).

  1. Czy w takim przypadku należy zaprzyjaźnić B z A czy może użyć innego sposobu?
  2. Czy do tego celu można wykorzystać metody publiczne klasy B? Jeśli tak to w jaki sposób? (Bardzo prosiłbym o najprostszy przykład)

Pozdrawiam!

1

Nie bardzo rozumiem z czym masz problem. :) Pokaż kod.
Tak na szybko, to to o czym piszesz można zrobić tak:



struct base {
	base() {}
}

struct foo {

	foo()
	 : b()
	 {
	 	
	 }
private:
	base b;
}

klasa zaprzyjaźniona nie jest tu do niczego potrzebna

0

No tak, jeśli tak to rozumieć to twoje rozwiązanie jest ok.
Problem w tym, że w konstruktorze klasy A (czyli tej zawierającej obiekt klasy B) chciałbym zrobić coś takiego:

 for(int i=0;i<liczba_elementow;i++)
 {
       Obiekt_b.arg_1 = i;
       Obiekt_b.arg_2 = i;
       cout<<"wpisuje obiekt do vectora"<<endl;
       vector_obiektow.push_back(Obiekt_b);
 }

w klasie A w pliku .h mam również zadeklarowany vector osobników B i obiekt klasy B:

vector <B> vector_obiektow;
B Obiekt_B;

Dlatego też nie zależy mi na inicjowaniu wartości obiektu klasy B w obiekcie klasy A podczas wywołania konstruktora - bo w rzeczywistości różne obiekty chce wpisać do vectora obiektów.

Ogółem chodzi o to, że tworząc klasę A chcę stworzyć kilka osobników klasy B o różnych parametrach.

1

Pomijając fakt, że konstruktor to nie jest miejsce na takie udziwnienia, to w czym problem? B Obiekt_B nie jest Ci do niczego potrzebny w tej sytuacji.

for(int i=0;i<liczba_elementow;i++)
 {
       cout<<"wpisuje obiekt do vectora"<<endl;
       vector_obiektow.push_back(B(i, i));
 }
1

To co zostało opisane jest powszechnym przypadkiem. Wniosek, autorowi się coś pomieszało i powinien pokazać kod, z którym ma problem.

0
  1. Pomijając fakt, że konstruktor to nie jest miejsce na takie udziwnienia>

Czy mógłbyś rozwinąć myśl?
W jaki sposób w takim razie zbudować Obiekt pewnej klasy która jest zbiorem innych obiektów jak nie w konstruktorze?
Nie wiem, np. klasa rój, składający się ze 1000. pszczół każda o innym udźwigu np. :D

  1. to w czym problem?>

Rzeczywiście obiekt B w klasie B nie jest potrzebny.
Dziwią mnie jednak usuwające się obiekty podczas wpisywania ich do vectora obiektów.

konstruktor klasy A:

    cout<<"tworze konstruktor"<<endl;
    for(int i=0;i<liczba_obiektow;i++)
    {
        cout<<"wpisuje obiekt do vectora"<<endl;
        vector_obiektow.push_back(B(i,i));
    }
    cout<<"stworzono konstruktor"<<endl;
tworze konstruktor
wpisuje obiekt do vectora
Usuwam Obiekt_B nr 0
wpisuje obiekt do vectora
Usuwam Obiekt_B nr 0
Usuwam Obiekt_B nr 1
wpisuje obiekt do vectora
Usuwam Obiekt_B nr 0
Usuwam Obiekt_B nr 1
Usuwam Obiekt_B nr 2
Usuwam Obiekt_B  do vectora
Usuwam Obiekt_B nr 3
wpisuje obiekt do vectora
Usuwam Obiekt_B nr 0
Usuwam Obiekt_B nr 1
Usuwam Obiekt_B nr 2
Usuwam Obiekt_B nr 3
Usuwam Obiekt_B nr 4
stworzono konstruktor

To co zostało opisane jest powszechnym przypadkiem. Wniosek, autorowi się coś pomieszało i powinien pokazać kod, z którym ma problem.>

Taaak, trochę zdążyłem sam przetestować różne metody, dlatego może taki lekki bałagan.

1
  1. Konstruktor powinien być prosty. Do forów można zrobić osobną metodę i wywołać ją w konstruktorze.

2.B(i,i) to obiekt tymczasowy, który jest tworzony, przypisany do argumentu funkcji składowej push_back a następnie usunięty. push_back(B arg = temp) - może tak będzie łatwiej, temp jest wpisane do arg, a potem usunięte.

E: no i oczywiście, przy zwiększaniu vector jakoś trzeba tę pamięć przydzielić od nowa, nie?

0

Konstruktor powinien być prosty. Do forów można zrobić osobną metodę i wywołać ją w konstruktorze.>

Ok, rozumiem. W sumie i tak miałem zamiar takie ruchy wykonać w odrębnych metodach. Tu pokazuje tylko drobne elementy.

E: no i oczywiście, przy zwiększaniu vector jakoś trzeba tę pamięć przydzielić od nowa, nie?>

No tak. Użyłbym resize() po tym for bądź reserve() przed.
I w przypadku, gdy z góry znam liczbę obiektów w vectorze, bardziej optymalnym rozwiązaniem będzie reserve()?

1

Jeżeli z góry znasz liczbę elementów, to niech konstruktor A wygląda tak:

A()  : vector_obiektow(100) // przyjmijmy, że będzie 100 obiektów bo nie wiem ile tam ich chcesz
{
 //reszta kodu
}

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