Tworzenie obiektów na stercie

0

Witam

Tak podczas nauki napotkałem taki problem, możliwe że coś gdzieś nie doczytałem i stad to pewnie głupie pytanie...

załóżmy że mamy taki kod gdzie w funkcji klasy musimy stworzyć obiekt innej klasy na stercie. I użytkownik może tę funkcje wywołać 10000 razy a może i nie wywołać w ogolę...Teraz pytanie jak poprawnie tworzyć te obiekty aby można było nimi zarządzać (usuwać, odczytywać zmienne, wywoływać funkcje itp.)

Daje przykładowy kod z błędem, czyli mamy wskaźnik na obiekt ale nic poza tym

#include <iostream>

using namespace std;

class Klasa1
{
        public :
        int zmienna;
        Klasa1(){}
        Klasa1(int x)
        {
                zmienna = x;
        }
        ~Klasa1(){}
        int inkrementacja(int x)
        {
                return x++;
        }
};

class Klasa2
{
        public :
        Klasa2(){}
        ~Klasa2(){}
        void funkcja(int x)
        {
                Klasa1 *obiekt = new Klasa1(x);
                obiekt->inkrementacja(obiekt->zmienna);
        }
};

int main()
{
        Klasa2 klasa2;

        int ile = 0;
        cout << "ile razy wywolac funkcje : ";
        cin  >> ile;

        for (int i=0;i<ile;i++)
        {
                klasa2.funkcja(5);
        }
        return 0;
}

Myślałem coś o dynamicznych tablicach ale nie bardzo mi to szło, wiem że są jeszcze np. wektory ale też skleić (chyba) sensownego kodu nie umiem dlatego wole nie strzelać w ciemno i zapytać was :)

Pozdrawiam

0

Cóż,jak jakowyś obiekt się powołało do życia poprzez new,to pamięć pozostanie nań przydzielona póki wskaźnik nie zostanie potraktowany przez delete (albo delete[] dla tablic);
Zatem dobrze kombinowałeś-stwórz sobie listę/wektor wskaźników do Klasa1,i tam je przechowywuj,a w destruktorze Klasa2 zapodajesz delete na każdym elemencie listy/wektora

0

zmieniłem tak jak napisałeś i nie wiem czy dobrze,niby działa i nie wiem też czy np. do funkcji nie lepiej dać w argumentach funkcji jako wskaznik do vectora jeśli operujemy na nim i zmieniamy jego zawartość ?

Tam gdzie coś dodałem dałem //+

#include <iostream>
#include <conio>
#include <vector>

using namespace std;

class Klasa1
{
        public :
        int zmienna;
        Klasa1(){}
        Klasa1(int x)
        {
                zmienna = x;
        }
        ~Klasa1(){}
        int inkrementacja(int x)
        {
                return x++;
        }
};

class Klasa2
{
        public :

        vector <Klasa1*> wek;                           // +

        Klasa2(){}
        ~Klasa2()
        {
                for (unsigned int i=0;i<wek.size();i++) // +
                {
                        delete wek[i];
                }
        }
        void funkcja(int x)
        {
                Klasa1 *obiekt = new Klasa1(x);
                obiekt->inkrementacja(obiekt->zmienna);
                wek.push_back(obiekt);             // +
        }

        void wyswietl()                            // +
        {
                for (unsigned int i=0;i<wek.size();i++)
                {
                        cout << wek[i]->zmienna << "\n";
                }
        }
};

int main()
{
        Klasa2 klasa2;

        int ile = 0;
        cout << "ile razy wywolac funkcje : ";
        cin  >> ile;

        for (int i=0;i<ile;i++)
        {
                klasa2.funkcja(i);
        }

        klasa2.wyswietl();                           // +
        getch();
        return 0;
}
0

Raczej nie,takie rzeczy jak wektor wskaźników to są wewnętrznymi bebechami klasy i nie powinny być wyciągane na zewnątrz
Co do kodu-gites,o takie coś dokładnie chodziło

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