Dynamiczna alokacja obiektów c++

0

Witam

Dopiero sie uczę i nie wszystkie pojecia zwiazane z obiektowym programowaniem sa mi znane dlatego chciałbym zadac kilka pytan (oczywiście przemyślanych i przegooglowanych)
Po pierwsze chodzi o dynamiczną alokacje obiektów, z tym ze liczba obiektów nie jest znana, to znaczy np mam klase samochody i użytkownik podaje kolejne modele samochodów jako obiekty i teraz z kazdym podanym modelem tworzy sie nowy obiekt, przy próbie robienia tego malloc -iem i realloc-iem nie do konca wychodziło.
Czy jest możliwość zrobienia czegos takiego?
Z góry dzięki :)

0

New i delete to twoi przyjaciele
(przynajmniej dopóki się ich nie zrazisz 3:) )

1

Inteligentne wskaźniki i towarzyszące im make_*(...)

1

Nie wiem czy chcesz się uczyć C++ od podstaw czy C++ takiego jakiego się teraz używa.

Przy pierwszej opcji pokaż co próbowałeś. Podaj kod i opisz co znaczy "przy próbie robienia tego malloc -iem i realloc-iem nie do konca wychodziło."
Jeżeli opcja druga to pogooglaj o

std::vector
0

Całogo kodu nie bede wstawiał bo było by to za duzo ale kilka fragmentów z którymi w sumie mam kilka problemów łącznie

deklaracja obiektu

Pracownik *os =(Pracownik*)malloc(sizeof(Pracownik)); 

wpisywanie wartosci i reallocowanie

os[j].Wpisz();
                j++;
                Pracownik *os= (Pracownik*) realloc(os,(j+1)*sizeof(Pracownik));

sama funkcja wpisz

  char *imie, *nazwisko;
     int i=0;
     siLiczPrac++;
     cout<<"Podaj imie ";
     fflush(stdin);
     imie=(char*) malloc(sizeof(char));
     char a=NULL;

    while(a!='\n')
    {
        scanf("%c",&a);
        if(a!='\n')
         {
         imie[i]=a;
         i++;
         imie=(char*) realloc(imie, (i+1)*sizeof(char));

         }
    }
     imie[i]='\0';

     Imie(imie);

metoda imie

void Pracownik::Imie(char* nowe_imie)
{
    delete[] pszImie;

    pszImie= nowe_imie;



} 

funkcja wypisz

 void Pracownik::Wypisz() const
{
    cout<<pszImie<<" "<<pszNazwisko<<" ";
}

Zapewne do czesci kodu bedą nie jedne zastrzeżenia.
A wiec w ten sposób nie jest wywoływany konstruktor domyślny.
Nie wiem czemu również gdy wprowadze imie dłuższe niz 7 znaków wyrzuca mi krzaczki. Jest to wina zapewne kodu w funkcji wpisz.
Jeśli chodzi o obiekty nie wiedziec czemu teraz dzialaja dobrze. Chociaz po utworzeniu wiecej niz 5 pojawia sie komunikat:
This application has requested the Runtime to terminate it in an unsual way.

2

malloc nie działa z obiektami, jeśli koniecznie musisz ręcznie alokować to przez new. A najlepiej to użyć std::vector.

imie=(char*) malloc(sizeof(char));

przecież rezerwujesz pamięć na 1 znak.

0

user image

A tak na serio (:

Ode mnie takie podpowiedzi.

Nie wiem gdzie używasz tego

 Pracownik *os= realloc(os,(j+1)*sizeof(Pracownik));

ale wydaję mi się, że gdzieś w funkcji tworzysz tymczasową zmienną i przypisujesz tam to co zwróci realloc. Nie przypisujesz tego do odpowiedniego wskaźnika czyli tego, którego tworzysz najpierw gdzieś w kodzie

Pracownik *os =(Pracownik*)malloc(sizeof(Pracownik));  

Przez takie coś masz wycieki pamięci.
Ale tak jak mówiłem. Nie widziałem całego kodu i może to ma sens.

Nie mieszaj malloców, realloców itp z new i delete. Przez to będą Ci się wywalały programy. W ogóle nie mieszaj C z C++.

Tak jak wcześniej napisałem, nie używaj malloców w C++, ale jeżeli będziesz kiedyś pisał w C coś to takie rzutowanie jest niepotrzebne

 Pracownik *os= (Pracownik*) realloc(os,(j+1)*sizeof(Pracownik)); 

wystarczy

 Pracownik *os= realloc(os,(j+1)*sizeof(Pracownik)); 

Do operacji na napisach używaj std::string zamiast char*

A za ten pomysł Ci się kłaniam. Nawet jakbym chciał to bym tego tak nie wykminił ;)

 imie=(char*) malloc(sizeof(char));
     char a=NULL;
 
    while(a!='\n')
    {
        scanf("%c",&a);
        if(a!='\n')
         {
         imie[i]=a;
         i++;
         imie=(char*) realloc(imie, (i+1)*sizeof(char));
 
         }
    } 
0

A to ja sie lepiej biore za przyswajanie vector-ów.
Z tego co tutaj czytam rozwiąze to wiekszosc moich problemów ;)
a co do funkcji wpisz to potrzebowałem rozwiazania które pozwoli mi na wczytanie wyrazu litera po literze rezerwujac przy tym tylko tyle miejsca w tablicy ile zajmie wyraz. A że realloc i malloc powiedzmy jest mi troche bliższe niż new wiec wolałem uzyc tego, jak widac z marnym skutkiem ;)

0

Zawsze mogłeś policzyć ile wyraz ma liter i tyle zaalokować

0

Zrobiłem wiec taki kod jednka wciąż wpisanie wiecej niz 7 znaków powoduje wyrzucanie krzaków.

  string imie1;     
     cout<<"Podaj imie ";
     fflush(stdin);
     cin>>imie1;
     char *imie=new char [imie1.length()];
     strcpy(imie,imie1.c_str());

     Imie(imie);

ten kod współpracuje z funkcja Imie a także wypisz które umieściłem u góry.
zmienna pszImie jest zadeklarowana w polu prywatnym w ten sposób:

 char *pszImie;

Czemu sie tak dzieje?

0

no i zrobiłeś nie do końca właściwie, powinno być

 
char *imie=new char [imie1.length() + 1];

dodatkowo

void Pracownik::Imie(char* nowe_imie)
{
    delete[] pszImie;
    pszImie= nowe_imie;
} 

To proszenie się o kłopoty!
Alokowoać i dealokowac staraj się tak, żeby było to wykonywane w tym samym "miejscu" (o ile to możliwe - są wyjątki, ale wyjątki potwierdzają regułę) a tu robisz to w obcym miejscu i nie masz pewności, że

  1. było cokolwiek zaalokowane
  2. że było zaalokowane właściwym alokatorem!
0

Co do pierwszego problemu to jeszcze uchwyciłem, a co do drugiego to hmm
deklaracja samej zmiennej w polu prywatnym wygląda tak:

char* pszImie; 

to w takim razie powinienem dodac coś takiego w funkcji Imie:?

 

pszImie=new char[strlen(nowe_imie)];
Tylko nie jestem pewien czy mozna w ten sposób sprawdzac długos takiej tablicy.

0

Nie znam całego Twojego projektu, ale użyj tam std::string, jeśli nie wiesz jak powinno to wyglądać, jeśli będziesz wiedział, że ma być inaczej, będziesz mógł zmienić, do czasu, do kiedy nie wiesz, używaj std::string.

0

Po małych modyfikacjach program działa, chyba w złym momencie usuwałem tablice imie z funkcji wpisz.
A jak na razie bede w dalszym ciagu przyswajał vector-y.
Dzięki :)

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