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

Programowanie obiektowe - problem z dynamiczną tablicą stringów w klasie
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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];

Sopelek
  • Rejestracja: dni
  • Ostatnio: dni
  • 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...

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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.

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • 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.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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ś.

DP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
1

Nie lepiej uzyc std::vector (http://en.cppreference.com/w/cpp/container/vector)?

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.