Dynamiczne alokowanie pamięci, wskaźniki
Ostatnio zmodyfikowano 2014-12-03 10:25
akcza Temat założony przez niniejszego użytkownika |
Dynamiczne alokowanie pamięci, wskaźniki » 2014-11-29 21:07:34 Witam. Najpierw kod: #include "Number.h" #include <iostream>
Number::Number() { this->number = new int; std::cout << "Number() \n"; }
Number::Number( int number2 ) { * number = number2; }
#include <iostream> #include "Number.h"
int main() { Number a; a = 4; getchar(); return 0; }
W linii * number = number2; wywala mi program (brak odpowiedzi programu). Z tego co wiem najpierw wywoływany jest konstruktor domyślny, a potem konstruktor przyjmujący inta, aby przeprowadzić konwersję z int na Number. Co jest nie tak? |
|
michal11 |
» 2014-11-29 22:10:42 No to źle wiesz. Zawsze wywoływany jest tylko jeden konstruktor albo domyślny albo kopiujacy albo z jakimiś argumentami, ale tylko jeden. |
|
akcza Temat założony przez niniejszego użytkownika |
» 2014-11-29 23:21:18 A podczasz przypisania nie wywołuje się niejawnie konstruktor konwertujący z int na number? |
|
akcza Temat założony przez niniejszego użytkownika |
» 2014-12-02 13:13:54 Ktoś pomoże? |
|
Monika90 |
» 2014-12-02 13:51:10 Tak, konstruktor konwertujący zostanie wywołany by zainicjalizować tymczasowy obiekt klasy Number wartosćią 4. Ale co u Ciebie robi ten konstruktor? Dereferencję niezainicjalizowanego wskaźnika: * number = number2; . Musisz najpierw alokować int, tak jak to robisz w konstruktorze domyślnym. PS. 1 Od pewnego czasu w C++ można wywołać jeden konstruktor z drugiego, więc jeśli masz kompilator, który na to pozwala, to robisz tak: Number::Number( int number2 ) : Number() { * number = number2; }
PS. 2 Po co Ci w ogóle wskaźnik? |
|
akcza Temat założony przez niniejszego użytkownika |
» 2014-12-02 20:51:23 Dzięki Monika za odpowiedź! Mam pytanie. Skoro To dlaczego muszę także alokować pamięć w drugim konstruktorze Number(int)? Oraz drugie pytanie: Number::~Number() { delete number; }
Dlaczego to nie działa? Zdaję sobie sprawę, że te pytania mogą być banalne, ale na prawdę szukałem na nie odpowiedzi w internecie i nie znalazłem. Zadanie ma wartość tylko edukacyjną, więc jest bezsensu. |
|
michal11 |
» 2014-12-02 22:40:33 a = 5; to nie jest konstruktor Number(int) tylko operator=(int);
Co ci w tym destruktorze nie działa ? |
|
Monika90 |
» 2014-12-03 10:25:51 To dlaczego muszę także alokować pamięć w drugim konstruktorze Number(int)? |
Masz dwa obiekty, jeden po lewej stronie = a drugi po prawej. a = 5; to nie jest konstruktor Number(int) tylko operator=(int); |
Ale on chyba nie ma takiego operatora, więc to raczej będzie konstruktor Number(int) i operator=(const Number&) Oraz drugie pytanie:
Number::~Number() { delete number; }
Dlaczego to nie działa? Zdaję sobie sprawę, że te pytania mogą być banalne, ale na prawdę szukałem na nie odpowiedzi w internecie i nie znalazłem.
|
Destruktor jest w porządku. Ale jak masz taki destruktor, to musisz też zdefiniować konstruktor kopiujący i operator przypisania, nazywa się to Reguła Trzech. Oczywiście, dużo przyjemniejsza w użyciu jest Reguła Zera http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html |
|
« 1 » |