Programowanie obiektowe - problem z dynamiczną tablicą stringów w klasie

Programowanie obiektowe - problem z dynamiczną tablicą stringów w klasie
KA
  • Rejestracja:około 12 lat
  • Ostatnio:około 12 lat
  • Postów:3
0

Witam!
Program crashuje przy wpisywaniu danych do tablicy stringów (Przedmioty).

Kopiuj
#include <iostram>
#include <string>
using namespace std;


class Student
{
public:
	
	string Imie;
	string Nazwisko;
	int Nr_albumu;
	float Srednia;
        string *Przedmioty;
	Student(){}
	Student(int n);

};


Student::Student(int n)
{
	Przedmioty= new string[n];
}

int main()
{
	int j,i;
	int K;

	cout<<"Podaj liczbe studentow: ";
	cin>>K;
	Student* tablica = new Student[K];
	for(i=0;i<K;i++)
	{
		cout<<endl<<"Student nr. "<<i+1<<endl<<"Imie: ";
		cin>>tablica[i].Imie;
		cout<<"Nazwisko: ";
		cin>>tablica[i].Nazwisko;
		cout<<"Nr. albumu: ";
		cin>>tablica[i].Nr_albumu;
		cout<<"Srednia: ";
		cin>>tablica[i].Srednia;
		cout<<"Ilosc przedmiotow: ";
		cin>>n;
		
		for(j=0;j<n;j++)
		{
			cout<<"Przedmiot nr. "<<j+1<<": ";
			cin>>tablica[i].Przedmioty[j];
		}
	}

	return 0;
}

Jak to zrobić, żeby działało?

Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0

to się nawet nie kompiluje...

a jeśli chodzi o twój problem, to crashuje dlatego, że nie przydzielasz pamięci na tą tablicę stringów

KA
  • Rejestracja:około 12 lat
  • Ostatnio:około 12 lat
  • Postów:3
0
Sopelek napisał(a):

to się nawet nie kompiluje...

I jak przydzielić tą pamięć?

To w konstruktorze nie wystarczy?:
Przedmioty= new string[n];

edytowany 2x, ostatnio: karpiq
Sopelek
to źle wkleiłeś/przepisałeś kod, bo jest '<iostram>' i nie ma zadeklarowanej zmiennej n w main
Sopelek
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:467
0

To w konstruktorze nie wystarczy?:
Przedmioty= new string[n];

problem w tym, że ty wywołujesz kostruktor domyślny, w którym tej pamięci nie przydzielasz...

edytowany 1x, ostatnio: Sopelek
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0
  • program się nie kompiluję
  • strasznie to jest dziwne napisane
  • Nie wywołasz konstruktora z parametrem dla tablicy obiektów. Lepiej skorzystać z kolekcji np vector (żeby wywołać konstruktor parametrowy musisz skorzystać z (), oczywiście jeżeli ten parametrowy nie będzie domyślny)

możesz szybko to poprawić robiąc

Kopiuj
SetIloscPrzedmiotow(int i)
{ 
  Przedmioty= new string[i];
}

przed wpisywaniem do przedmiotów. Ale ja bym to napisał od nowa i zupełnie inaczej, bo nie jest to napisane jak być powinno.

edytowany 4x, ostatnio: fasadin
KA
  • Rejestracja:około 12 lat
  • Ostatnio:około 12 lat
  • Postów:3
0
Kopiuj
#include <iostream>
#include <string>
using namespace std;


class Student
{
public:
	
	string *Przedmioty;
	string Imie;
	string Nazwisko;
	int Nr_albumu;
	float Srednia;
	Student(){}
	Student(int n);

};


Student::Student(int n)
{
	Przedmioty= new string[n];
}



int main()
{
	int j,i,n;
	int K;

	cout<<"Podaj liczbe studentow: ";
	cin>>K;
	Student* tablica = new Student[K];
	for(i=0;i<K;i++)
	{
		cout<<endl<<"Student nr. "<<i+1<<endl<<"Imie: ";
		cin>>tablica[i].Imie;
		cout<<"Nazwisko: ";
		cin>>tablica[i].Nazwisko;
		cout<<"Nr. albumu: ";
		cin>>tablica[i].Nr_albumu;
		cout<<"Srednia: ";
		cin>>tablica[i].Srednia;
		cout<<"Ilosc przedmiotow: ";
		cin>>n;
		
		for(j=0;j<n;j++)
		{
			cout<<"Przedmiot nr. "<<j+1<<": ";
			cin>>tablica[i].Przedmioty[j];
		}
	}
	


	return 0;
}

To już się kompiluje.
Dziwnie napisane bo po raz pierwszy korzystam z klas.

fasadin
zrobiłem edit mały. przeczytaj sobie.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:2 minuty
0

new Student[K]; przy tworzeniu tej tablicy wywoływany jest DOMYŚLNY konstruktor tworzony automatycznie (ty go nie zdefiniowałeś). Efekt jest taki, że pole Przedmioty pozostanie nieustawione (wskazuje na przypadkowe miejsce), bo twój konstruktor nigdy nie jest wywoływany!
Dodaj domyślny konstruktor, albo domyślna wartość n dla konstruktora, który zdefiniowałeś.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Sopelek
zdefiniował w ciele klasy, tylko jest mało zauważalny. Jakby go nie zdefiniował to by kompilator sypnął błędem
MarekR22
i tak nie różni się od tego generowanego automatycznie, więc błąd jest nadal ten sam.
DP
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
  • Postów:6
1

Brak polskich znakow zwiazany z lenistwem <sup>.</sup>
edytowany 1x, ostatnio: DamianPrg

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.