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

Tablica wskaźników do obiektów - tworzenie obiektu za pomocą operatora 'new'.

Ostatnio zmodyfikowano 2016-12-18 02:04
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Tablica wskaźników do obiektów - tworzenie obiektu za pomocą operatora 'new'.
» 2016-12-18 01:32:23
Witam. Na początek przykład, proszę spojrzeć:
C/C++
class Ram
{
    string firma;
    int pojemnosc;
public:
    void informacje()
    {
        cout << "firma " << firma << " pojemnosc " << pojemnosc << " gb.\n";
    }
    Ram( string ffirma, int ppojemnosc )
        : pojemnosc( ppojemnosc )
         , firma( ffirma )
    {; }
};
//*********************************************************************************
//*********************************************************************************
int main()
{
    Ram * kosci[ 4 ]; // tablica wskaznikow do obiektu
    string firma;
    int ile_kosci, wielkosc_ramu;
    cout << "podaj ile slotow ma byc zajete(1-4): ";
    cin >> ile_kosci;
    for( int i = 0; i < ile_kosci; i++ )
    {
        cout << "wpisz firme " <<( i + 1 ) << " kosci: ";
        cin >> firma;
        cout << "wpisz ilosc ramu (w gb): ";
        cin >> wielkosc_ramu;
        cout << endl << endl;
        kosci[ i ] = new Ram( firma, wielkosc_ramu ); // tworzenie obiektu za pomoca new
    }
    ( * kosci )[ 1 ].informacje(); //funkcja skladowa (na gorze) i problem
Problem jest następujący: Kiedy podamy parametry np. 2 kości i wywolamy funkcję
( * kosci )[ 1 ].informacje();
 wyskakuje błąd krytyczny. Dlaczego? Przecież Mamy utworzone za pomocą wskaźników 2 obiekty typu ram. na jeden wskazuje kosci[0] a na drugi kosci[1]. Tak więc wszystko powinno się udac. Co ciekawe przy wywołaniu funkcji
( * kosci )[ 2 ].informacje();
 (przy stworzeniu po jednym obiektu dla każdego wskaźnika) wypisuje się zawartość drugiej kości, a przecież numerujemy od 0, więc powinna pokazać się specyfikacja kości trzeciej. Proszę o pomoc.
P-155115
pekfos
» 2016-12-18 01:38:41
C/C++
( * kosci[ 1 ] ).informacje()
kosci[ 1 ]->informacje() // lub tak
P-155116
carlosmay
» 2016-12-18 01:48:55
C/C++
int main()
{
    Ram * kosci[ 4 ]; // tablica wskaznikow do obiektu
    string firma;
    int ile_kosci, wielkosc_ramu;
    cout << "podaj ile slotow ma byc zajete(1-4): ";
    cin >> ile_kosci;
    for( int i = 0; i < ile_kosci; i++ )
    {
        cout << "wpisz firme " <<( i + 1 ) << " kosci: ";
        cin >> firma;
        cout << "wpisz ilosc ramu (w gb): ";
        cin >> wielkosc_ramu;
        cout << endl << endl;
        kosci[ i ] = new Ram( firma, wielkosc_ramu ); // tworzenie obiektu za pomoca new
    }
   
    for( int i = 0; i < ile_kosci; ++i ) {
        kosci[ i ]->informacje(); // czemu nie używasz takiego zapisu, po to go wymyślono
    }
    for( int i = 0; i < ile_kosci; ++i ) {
        delete kosci[ i ]; // zapomniałeś zwolnić przydzieloną pamięć
    }
}
P-155117
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-18 02:04:41
@pekfos
Dzięki
@Carlos
kosci[ i ]->informacje();
Nie używam bo nie lubię tego zapisu :/
Z drugiej strony zapominam, że istnieje.
Wiem jak działa, ale... wydaje mi się to jakieś takie dziwne... Jakby wyrwał się z szeregu.
Pamięć miałem zwolnić później, bo te obiekty będą mi jeszcze potrzebne, ale faktycznie w tym wyciętym przykładzie zapomniałem.
Dzięki za pomoc, temat zamykam :))
P-155118
« 1 »
  Strona 1 z 1