Wpis z mikrobloga

Mam sobie klasę:

http://pastebin.com/ZBqFYzqC

która zawiera 3 pola: dwa wskaźniki i jednego int'a.

Normalnie można wyłuskiwać pola np. tak:

Node* node = new Node(); // Inicjalizuje pola next i previous na nullptr

node->next; // node->next == nullptr

Jeśli zaś chcę jeszcze wyłuskać coś z next'a to robię:

node->next->data; // node->next == nullptr, co daje nullptr->data

Ale tutaj jest błąd, bo node->next to wskaźnik nullptr, więc nie można z niego nic wyłuskać.

Da się tak przeciążyć operator -> (lub ewentualnie ->), że jak robię właśnie takie coś:

node->next->data; // node->next == nullptr

To sam będzie sprawdzał czy nie jest próba wyłuskania czegoś z nullptr?

Wyobrażam to sobie coś w tę stronę:

if(this == nullptr)

throw "Wyjatek";

else

return (/ odpowiednie pole */)

Problem jest w tym, że jakby Node zawierało tylko jedno pole, to można by je bezpośrednio zwracać, np.:

return data;

Da się takie coś zrobić? Jest w ogóle sens? ;d

#programowanie #cpp
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Lempek: przeciążanie

operator->
polega na tym, że zwracasz jakiś inny obiekt, na którym wywoływany jest ponownie.

operator->
jest wywoływany tak długo, aż dojdzie do surowego pointera. Twój pomysł z rzucaniem da się zrobić, ale to bez sensu trochę, bo blokujesz tym samym możliwość podejrzenia wartości wew. pointera. Ja bym może tylko zrobił jakieś gettery/settery na pola i to wszystko, resztą powinien się użytkujący martwić.
  • Odpowiedz
@Lempek: A sprawdzanie czy

this == nullptr
jest nie do zrealizowania, bo sama dereferencja nullptr-a jest UB. Przypuszczam, że kompilator takie sprawdzenie mógłby nawet usunąć z tego powodu i przeszedłby od razu do reszty metody.
  • Odpowiedz