Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamiczne tworzenie obiektów klas

Ostatnio zmodyfikowano 2014-04-14 16:17
Autor Wiadomość
mateuszq
Temat założony przez niniejszego użytkownika
Dynamiczne tworzenie obiektów klas
» 2014-04-12 18:12:19
Witam, chciałbym sie dowiedzieć czy moge w poniższy spobób tworzyć obiekty klas (skład klasy nie jest ważny chodzi mi o sam sposob tworzenia nowych obiektów).
W funkcji main() tworze sobie wskaźnik do klasy osoba po czym dynamicznie alokuje pamięc i teraz tak, wydaje mi sie że powinienem podać odrazu rozmiar tablicy tych tworzonych dynamicznie obiektów jednak ja tego nie robie i dopeiro potem podczas tworzenia podaje odpowiedni indeks. Niby się kompiluje ale wydaje mi sie, że jest to nie poprawne proszę o jakąs opinie...

Moje założenie było takie, że chce w trakcie trwania programu opcjonalnie (jeżeli zajdzie taka potrzeba) tworzyć sobie nowy obiekt.

C/C++
#include <iostream>
#include <conio.h>

using namespace std;

class osoba {
   
    int wiek;
    double wzrost;
   
public:
    osoba( int, double );
    ~osoba();
    void wpisz();
    void wyswietl();
   
    friend osoba tworz();
};
osoba::osoba( int wiekk = 0, double wzrostt = 0 )
    : wiek( wiekk )
    , wzrost( wzrostt )
{ }

osoba::~osoba() { cout << "destruktor" << endl << endl; }

void osoba::wpisz() {
    cout << "wiek: "; cin >> wiek;
    cout << "wzrost: "; cin >> wzrost;
}

void osoba::wyswietl() {
    cout << "Wiek: " << wiek << endl;
    cout << "Wzrost: " << wzrost << endl;
}


osoba tworz( int a, double b ) {
    osoba nowa( a, b );
    return nowa;
}

int main() {
    osoba * tab;
   
    tab = new osoba; //NIE INICJALIZUJE WIELKOSCI TABLICY
    osoba pierwsza( 20, 45.56 );
    pierwsza.wyswietl();
   
    tab[ 0 ] = tworz( 20, 1000 ); //TUTAJ TWORZE SOBIE OBIEKT O ODPOWIEDNIM INDEKSIE
    tab[ 0 ].wyswietl();
    tab[ 1 ] = tworz( 100, 100.300 );
    tab[ 1 ].wyswietl();
    //itd...
    //tab[0].wyswietl();
   
    _getch();
    return 0;
}
P-108061
f651144
» 2014-04-12 18:19:13
Nie, nie, nie. Trochę pokręciłeś.

1. W tym miejscu:
tab = new osoba;
 tworzysz tablicę jednoelementową, czyli po prostu dynamicznie alokujesz jeden obiekt klasy osoba (o ile alokacja się uda, ale wiem, że w większości książek i uczelni nikt się tym nie przejmuje - taka dygresja).

2. Tu:
tab[ 0 ] = tworz( 20, 1000 );
 nic nie tworzysz, tylko kopiujesz (przypisujesz).

3. A tu:
tab[ 1 ] = tworz( 100, 100.300 );
 wykraczasz poza zakres tablicy o 1.
P-108062
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-04-12 18:29:33
Jest jakas możliwosc napisania takiej funkcji tworzącej obiekt "na zawołanie"? Oczywiscie mógłbym to zrobic na zasadzie takiej ze funkcja tworzy obiekt potem go zwraca i przypisuje do jakiegos obiektu ale nie o to mi chodzi. Może na takim przykładzie. Mam klase osoba, w trakcie pracy programu jest opcja w "menu" "dodaj nową osoba" i chciałbym po wybraniu tej opcji stworzyć TRWALE taki obiekt klasy osoba, a nie tylko chwilowy lokalny obiekt ktory bedzie dostępny w obrębe jakiejś funkcji po czym zniknie
P-108064
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-04-12 18:33:30
Chciałbym sie też obejsć bez inicjalizacji duzych tablic obiektów, raz bedą mi potrzebne dwa obiekty a raz 100 i inicjalizaując taką tablice przy utworzeniu przypuśćmy tylko dwóch obiektów to będzie marnotrawstwo pamięci
P-108065
Monika90
» 2014-04-12 18:44:33
raz bedą mi potrzebne dwa obiekty a raz 100
std::vector<osoba>
P-108067
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-04-13 10:59:20
dzięki za podpowiedz, przynajmniej teraz wiem za co sie zabrac :)
P-108098
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-04-13 15:52:08
Jeszcze mam takie pytanie.

Tworze sobie jakas liste

C/C++
vector < obiekt *> pierwszy;
.
.
.
.
pierwszy.push_back( new obiekt ); //CZY DA SIE W TYM MIEJSCU PODCZAS TWORZENIA OBIEKTU UZYĆ  INNEGO       KONSTURKTORA NIŻ DOMYŚLNY? CHCIALBYM ODRAZU ZAINICJALIZOWAC DANE
P-108118
RazzorFlame
» 2014-04-13 19:13:35
vec.push_back( new obiekt( argument, argument, argument...) );
lub:
C/C++
obiekt * obj = new obiekt( argument, argument, argument...);
vec.push_back( obj );
Nie zapomnij na końcu usunąć obiektów poprzez delete.
P-108129
« 1 » 2
  Strona 1 z 2 Następna strona