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:
 
 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.Number::~Number(){
 delete number;
 }
 
 | 
 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 » |