ďťż

Ładny brzuch

Hello, narazie jestem przy odcinku 3 ale nadrabiam jakoś :) Napisałem programik do ćw3 do cz3 kursu obiektowego, oto kod:

punkt.cpp
#include <iostream> #include <conio> #include "punkt.h" using namespace std; //****************************************************************************** int Punkt::pobierzX() { return *pX; } int Punkt::pobierzY() { return *pY; } void Punkt::ustawWspolrzedne(int *wspX, int *wspY) { pX = wspX; pY = wspY; } //****************************************************************************** int main() { int x, y; cout << "Podaj x : "; cin >> x; cout << "Podaj y : "; cin >> y; Punkt punkt; punkt.ustawWspolrzedne(&x, &y); cout << "Wartosc pol obiektu punkt" << endl; cout << "x : " << punkt.pobierzX() << endl; cout << "y : " << punkt.pobierzY() << endl; getch(); return 0; }

punkt.h
class Punkt { private: int* pX; int* pY; public: int pobierzX(); int pobierzY(); void ustawWspolrzedne(int *wspX, int *WspY); Punkt() { pX = new int; pX = 0; pY = new int; pY = 0; } ~Punkt() { delete pX; delete pY; } };

Kompilacja przebiega bezproblemowo ale po uruchomieniu programiku i zakończeniu jego działania windows wywala bład.
Coś mi się wydaje że destruktor niewłaściwie działa ;/
Jak ktoś może niech mi pomoże odszukać bląd. Dzięki wielkie za pomoc :)



A jaki to błąd?

"Wystąpił problem z aplikacją Project2.exe i zostanie ona zamknięta. Przepraszamy za kłopoty."

czyli windowsowy

Spróbuj takich zmian:
Punkt() { pX = new int; *pX = 0; pY = new int; *pY = 0; } void Punkt::ustawWspolrzedne(int *wspX, int *wspY) { *pX = *wspX; *pY = *wspY; }



dzięki, pomogło :)

Jakoś Ekspertowi nie idzie tłumaczenie wskaźników. Nie czytalem co prawda ich kursu, ale książeczkę z Biblioteczki (nie chciałem tylu zdrobnień, nie moja winka ;)) Komputer Świata i też nic nie rozumiałem. Za to przy czytaniu "Symfoni C++" wszystko wydawało się być oczywiste.

Operator * służy do wydowbywania ze wskaźnika alementu, na który wskazuje. Dzięki niemu możemy zmienić lub odczytać wartość zmiennej, pokazywanej przez wskaźnik.

Nie używając tego operatora otrzymujemy adres, pod którym znajduje się dany obiekt. Możemy adres zmienić (aby wskaźnik pokazywał na inny obiekt) lub go odczytać (np. aby przekazać innemu wskaźnikowi).

W twoim programi funkcja:
void Punkt::ustawWspolrzedne(int *wspX, int *wspY) { pX = wspX; pY = wspY; }
przepisywała adres, tak, że teraz wskaźniki pX i pY pokazywały na zmienne x i y z funkcji main(). Tak więc wartość wyświetlana na ekranie była ta sama, bo i była to ta sama zmienna. Kłopot wywolał dopiero ruszający przy zamykaniu programu destruktor:
~Punkt() { delete pX; delete pY; }
bowiem chciałeś usunąć nie obiekt, który utworzyłeś w konstruktorze, ale zmienne x i y funkcji main().

Twój program był także o tyle tragiczny, że powstały niewielkie wycieki: nie zwolniłeś zaalokowanej pamięci, tak więc aż do ponownego uruchomienia komputera i zresetowania pamięci RAM marnuje się w niej miejsce na dwie zmienne int.


tak więc aż do ponownego uruchomienia komputera i zresetowania pamięci RAM marnuje się w niej miejsce na dwie zmienne int. Nie bylo az tak zle ;). Manager pamieci automatycznie zdealokuje pamiec procesu, kiedy ten konczy dzialanie :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •