• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyświetlenie tablicy stworzonej w konsktruktorze - C++

Object Storage Arubacloud
0 głosów
152 wizyt
pytanie zadane 5 sierpnia 2022 w C i C++ przez Mausor11 Nowicjusz (120 p.)

Witam, zacząłem uczyć się programowania obiektowego i napotkałem pewien problem. Nie rozumiem jak stworzyć tablicę w konsktruktorze klasy, nadać jej tam wartości, a następnie wyświetlić zawartość tablicy. Czy ktoś jest w stanie mi pomóc.

Kod:

#include <iostream>
#include <vector>

using namespace std;

class wektorInt
{
public:
    wektorInt();
    void wyswietl ();


};

int main()
{
    int tablica[32];
    wektorInt wektor;
    wektor.wyswietl();
    return 0;
}

wektorInt::wektorInt()
{
    int tab[32];
    for(int i=0;i<32;i++)
    {
        tab[i]=i;
    }
}
void wektorInt::wyswietl()
{
    for(int i=0;i<32;i++)
    {
        cout<<tablica[i]<<" ";
    }
}

 

2 odpowiedzi

0 głosów
odpowiedź 6 sierpnia 2022 przez Apled Dyskutant (9,520 p.)
Możesz zadeklarować tablicę w klasie jako pole prywatne i inicjalizować ją w konstruktorze, ewentualnie przekazywać tablice jako parametr do konstruktora - Twój wybór.

W takiej wersji jaką tutaj podałeś robisz tak, że tablice tworzysz WEWNĄTRZ konstruktora i tam ja wypełniasz, tym samym istnieje ona tylko w obrębie tego zakresu - czyli nie możesz się do niej odwołać nigdzie poza konstruktorem.
komentarz 6 sierpnia 2022 przez Mausor11 Nowicjusz (120 p.)

Już wszystko zrozumiałe, wystarczyło dłużej pomyśleć. Dziękuje!
 

#include <iostream>
#include <vector>

using namespace std;

class wektorInt
{
public:
    int tablica[32];

    wektorInt();
    void print ();

};

int main()
{
    wektorInt wektor;
    wektor.print();
    return 0;
}
wektorInt::wektorInt()
{
    for(int i=0;i<32;i++)
        {
            tablica[i]=i;
        }
}
void wektorInt::print()
{
        for(int i=0;i<32;i++)
        {
            cout<<tablica[i]<<" ";
        }
}

 

0 głosów
odpowiedź 6 sierpnia 2022 przez profesorek96 Szeryf (91,420 p.)
edycja 6 sierpnia 2022 przez profesorek96

Pozwoliłem sobie poprawić troszkę twój kod. Dodałem stosowne komentarze.

#include <iostream>
using namespace std;
 
class wektorInt
{
	int *tab;//wskaznik
public:
    wektorInt();//konstruktor
    ~wektorInt();//destruktor
    void wyswietl ();//metoda
 
 
};
 
int main()
{
    //int tablica[32];//to nie jest potrzebne
    wektorInt wektor;
    wektor.wyswietl();
    return 0;
}
 
wektorInt::wektorInt()
{
    //int tab[32];//ta tablica jest 
    //tablica statyczna istnieje tylko 
    //wewnatrz funkcji, konstruktora
    tab=new int[32];//tworzymy tablice 32 
    //elementowa dynamiczną
    for(int i=0;i<32;i++)
    {
        tab[i]=i;
    }
}
wektorInt::~wektorInt()
{
	delete[] tab;//zwalniamy pamięć 
	//zarezerwowaną w konstruktorze
	//dla tablicy dynamicznje
}
void wektorInt::wyswietl()
{
    for(int i=0;i<32;i++)
    {
        cout<<tab[i]<<" ";
    }
}

 

komentarz 6 sierpnia 2022 przez j23 Mędrzec (194,920 p.)

 delete tab;//zwalniamy pamięć

delete[] tab;

W sumie jeśli ten wektor zawsze ma 32 inty, to zabawa w dynamiczną pamięć jest niepotrzebnym komplikowaniem kodu, dlatego że musisz (czego nie zrobiłeś) przynajmniej zablokować możliwość kopiowania obiektów tej klasy (a najlepiej dodać ctor i operator kopiujący).

komentarz 6 sierpnia 2022 przez profesorek96 Szeryf (91,420 p.)
edycja 6 sierpnia 2022 przez profesorek96

Tak masz rację, nie napisałem konstruktora kopiującego plus zapomniałem o dodaniu [] po słowie delete.

Poprawiony kod:

#include <iostream>
using namespace std;
 
class wektorInt
{
	int *tab;//wskaznik
public:
    wektorInt();//konstruktor
    wektorInt(const wektorInt& obj);//konstruktor kopiujacy
    ~wektorInt();//destruktor
    wektorInt& operator=(const wektorInt& obj);//przeciazenie
    //operatora przypisania
    void wyswietl ();//metoda
 
 
};
 
int main()
{
    //int tablica[32];//to nie jest potrzebne
    wektorInt wektor;
    wektor.wyswietl();
    cout<<endl;
    wektorInt wektor2(wektor);//kopiujemy obiekt
    wektor2.wyswietl();
    return 0;
}
 
wektorInt::wektorInt()
{
    //int tab[32];//ta tablica jest 
    //tablica statyczna istnieje tylko 
    //wewnatrz funkcji, konstruktora
    tab=new int[32];//tworzymy tablice 32 
    //elementowa dynamiczną
    for(int i=0;i<32;i++)
    {
        tab[i]=i;
    }
}
wektorInt::wektorInt(const wektorInt& obj)
{
	tab=new int[32];//tworzymy tablice 32 
    //elementowa dynamiczną
    //kopiujemy element po elemncie zawartosc
    //tablicy w obiekcie obj
    for(int i=0;i<32;i++)
    {
        tab[i]=obj.tab[i];
    }
}
wektorInt& wektorInt::operator=(const wektorInt& obj)
{
	//kopiujemy element po elemncie zawartosc
    //tablicy w obiekcie obj
    for(int i=0;i<32;i++)
    {
        tab[i]=obj.tab[i];
    }
}
wektorInt::~wektorInt()
{
	delete[] tab;//zwalniamy pamięć 
	//zarezerwowaną w konstruktorze
	//dla tablicy dynamicznje
}
void wektorInt::wyswietl()
{
    for(int i=0;i<32;i++)
    {
        cout<<tab[i]<<" ";
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 789 wizyt
0 głosów
1 odpowiedź 351 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez vishi7 Początkujący (430 p.)
0 głosów
1 odpowiedź 199 wizyt

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...