Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Uzikan

Dynamiczne pole w klasie

Rekomendowane odpowiedzi

Witam,

musze na jutro skończyć program, a jako że jest już mało czas pozwoliłem sobie poprosić was o pomoc.

Poniżej zamieszczam kod programu, wyrzuciłem z niego zbędne wiersze aby nie komplikować. Generalnie problem wygląda tak: mam klase Student, dynamiczą tablice TAB obiektów klasy Student. W klasie jest zdefiniowana dynamiczna tablica na Przedmioty. Dla każdego studenta użytkownik będzie podawał dowolną ilość Przedmiotów. Do rzeczy: problem mam z alokacją pamięci na Przedmioty oraz przypisania do tego pola wartości. Chodzi o pogrubioną linijkę w kodzie. Nie chce mi się przez nią kompilować. Aha i jeszcze jedno, w konstruktorze klasy jest niby alokacja pamięci ale nie wiem czy to jest tak jak być powinno.

int N;
int K;

class Student {
public:
string *Przedmioty;	
Student(){		//konstruktor
	Przedmioty=new string[N];
}
};

int _tmain(int argc, _TCHAR* argv[])
{
cerr<<"Ilu studentow chcesz dodac? ";
cin>>K;

Student *TAB=new Student[K];	//dynamiczna tablica obiektow klasy Student

for(int i=0;i<K;i++){	//wczytanie przedmiotow dla kazdego studenta

	for(int k=0;k<N;k++){
		cerr<<"\t przedmiot "<<k+1<<": ";
		[b]cin>>TAB[i].Przedmioty[k];[/b]
	}
	cout<<endl;
} 

delete[]TAB;
system("PAUSE");
return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

na poczatku pierwszej petli powinno byc jeszcze TAB = new Student()

 

to tak na pierwszy rzut oka :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość tobix10

A ile wynosi N ?

W destruktorze musi być zwolnienie tablicy przedmiotów.

 

Wszystko wydaje się być dobrze, może masz gdzie indziej błąd albo przez to, że N nie ma przypisanej żadnej wartości.

 

//edit

Teraz problemy innej natury:

1. cerr służy do wypisywania do strumienia błędów, nie powinieneś go używać w takich sytuacjach. Od tego jest cout.

2. Przedmioty to składowa Studenta i nie powinna być widoczna na zewnątrz , a szczególnie nie powinieneś tak ich wczytywać. Klasy są po to, żeby były 'samowystarczalne'. Lepszym rozwiązaniem byłaby funkcja wczytaj lub przeładowanie operatora <<.

3. N jako wielkość tablicy Przedmioty w sumie też powinna należeć do klasy. To w klasie ma być wiadomo ile jest przedmiotów. Ponadto mogłaby być argumentem konstruktora z jakąś domyślną wartością np. Student(int _N = 5) : N(_N) { Przedmioty = new string[N]; }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1. cerr służy do wypisywania do strumienia błędów, nie powinieneś go używać w takich sytuacjach. Od tego jest cout.

Powiem tak, to jest nawyk który wpoił mi nie dawno mój wykładowca (dr). Chodzi o rozróżnienie tego co chcemy wydrukować a co jest potrzebne aby program się wykonał. Dr mówił że do zaproszeń do wczytania danych powinno się używać właśnie cerr. Jakby używać "cout" to jak będziesz chciał przekierować strumień na drukarke to wydrukuje ci te wszystkie zaproszenia typu "podaj x:" itd. Jak użyjesz cerr to się nie wydrukuje

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość tobix10

Nie każdy program jest pisany, żeby działał z drukarką, skanerem czy jakimkolwiek innym sprzętem.

Jeżeli chciałbym dodać możliwość wydruku to bym zrobił sam taką funkcję, która ładnie sformatowałaby mi wszystko.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No ale ta drukarka to taki przykład. Pod linuksem masa narzędzi działa na strumieniach - można przekierować wyjście z jednego programu pod wejście drugiego, zapisać tymczaswe wyniki do pliku, albo po prostu wyświetlić na monitorze. Program jest uniwersalny, a do tego nie trzeba osobno oprogramowywać poszczególnych przypadków.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...