Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamiczne alokowanie pamięci, wskaźniki

Ostatnio zmodyfikowano 2014-12-03 10:25
Autor Wiadomość
akcza
Temat założony przez niniejszego użytkownika
Dynamiczne alokowanie pamięci, wskaźniki
» 2014-11-29 21:07:34
Witam. Najpierw kod:

C/C++
#include "Number.h"
#include <iostream>

Number::Number()
{
   
    this->number = new int;
    std::cout << "Number() \n";
}

Number::Number( int number2 )
{
    //std::cout << &number2 << "\n";
    * number = number2; // TUTAJ BŁĄD
   
   
}

C/C++
#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?
P-121716
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.
P-121719
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?
P-121724
akcza
Temat założony przez niniejszego użytkownika
» 2014-12-02 13:13:54
Ktoś pomoże?
P-121925
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:
C/C++
Number::Number( int number2 )
    : Number()
{
    * number = number2;
}

PS. 2 Po co Ci w ogóle wskaźnik?
P-121927
akcza
Temat założony przez niniejszego użytkownika
» 2014-12-02 20:51:23
Dzięki Monika za odpowiedź!
Mam pytanie. Skoro
C/C++
Number a; //konstruktor Number()
a = 5; //konstruktor Number(int)
 To dlaczego muszę także alokować pamięć w drugim konstruktorze Number(int)?

Oraz drugie pytanie:
C/C++
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.
P-121997
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 ?
P-122023
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:
C/C++
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
P-122048
« 1 »
  Strona 1 z 1