• 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++

0 głosów
54 wizyt
pytanie zadane 2 dni temu 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ź 2 dni temu przez Apled Mądrala (7,300 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 2 dni temu 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ź 1 dzień temu przez profesorek96 Szeryf (91,500 p.)
edycja 1 dzień temu 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 1 dzień temu przez j23 Mędrzec (176,640 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 1 dzień temu przez profesorek96 Szeryf (91,500 p.)
edycja 1 dzień temu 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ź 365 wizyt
0 głosów
1 odpowiedź 143 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez vishi7 Początkujący (370 p.)
0 głosów
1 odpowiedź 129 wizyt

88,663 zapytań

137,273 odpowiedzi

306,605 komentarzy

58,864 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...