• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nadpisanie funkcji toString() język D

Object Storage Arubacloud
0 głosów
167 wizyt
pytanie zadane 29 sierpnia 2020 w Inne języki przez poldeeek Mądrala (5,980 p.)

Próbuję napisać klasę reprezentującą liczby wymierne w języku D. 
 

class LiczbaWymierna {
    int licznik;
    int mianownik;

        public:
        this(int a, int b) {
            if(b != 0) {                
                this.licznik = a;
                this.mianownik = b;
            } else writefln("Mianownik nie moze byc rowny 0!");
        };

        override string toString(LiczbaWymierna a){
            return format("%d / %d", a.licznik, a.mianownik);
        };
}

 

Nie bardzo rozumiem czemu przy nadpisaniu funkcji toString() wyrzuca mi taki błąd...
 

prog.d(15): Error: function string prog.LiczbaWymierna.toString(LiczbaWymierna a) does not override any function, did you mean to override string object.Object.toString()? 

 

1 odpowiedź

+1 głos
odpowiedź 29 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
wybrane 29 sierpnia 2020 przez poldeeek
 
Najlepsza

Nie nadpisujesz żadnej funkcji, o czym mówi kompilator. Tworzysz nową. Funkcja toString jest bezparametrowa, przynajmniej ta do przeciążenia. 

override string toString();
//albo
string toString(LiczbaWymierna a);

 

komentarz 29 sierpnia 2020 przez poldeeek Mądrala (5,980 p.)

Czyli rozumiem, że jeśli potem chcę wyświetlać taką liczbę za pomocą writefln(), muszę to zrobić tak :
 

        override string toString(){
            return format("%d / %d", this.licznik, this.mianownik);
        };

Tylko wtedy z kolei błąd wygląda tak :
 

prog.d(24): Error: template std.stdio.writefln cannot deduce function from argument types !()(LiczbaWymierna), candidates are:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(4095):        writefln(alias fmt, A...)(A args)
C:\D\dmd2\windows\bin\..\..\src\phobos\std\stdio.d(4106):        writefln(Char, A...)(in Char[] fmt, A args)

 

1
komentarz 29 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
import std;
class LiczbaWymierna {
    int licznik;
    int mianownik;
 
        public:
        this(int a, int b) {
            if(b != 0) {                
                this.licznik = a;
                this.mianownik = b;
            } else writefln("Mianownik nie moze byc rowny 0!");
        };
 
        override string toString(){
            return format("%d / %d", this.licznik, this.mianownik);
        };
}


void main()
{
    LiczbaWymierna a = new LiczbaWymierna(3,4);
    writeln(a.toString());
}

 

komentarz 29 sierpnia 2020 przez poldeeek Mądrala (5,980 p.)
edycja 29 sierpnia 2020 przez poldeeek

Mam jeszcze jedno pytanie, ponieważ teraz przeciążam operatory i doszedłem do dzielenia. 
 

        LiczbaWymierna opBinary(string op)(LiczbaWymierna a) {
            static if(op == "+") {
                int nowyLicznik = this.licznik * a.mianownik + mianownik * a.licznik;
                int nowyMianownik = this.mianownik * a.mianownik;
                return new LiczbaWymierna(nowyLicznik, nowyMianownik);
            } else static if(op == "-") {
                int nowyLicznik = this.licznik * a.mianownik - mianownik * a.licznik;
                int nowyMianownik = this.mianownik * a.mianownik;
                return new LiczbaWymierna(nowyLicznik, nowyMianownik);
            } else static if (op == "*") {
                int nowyLicznik = this.licznik * a.licznik;
                int nowyMianownik = this.mianownik * a.mianownik;
                return new LiczbaWymierna(nowyLicznik, nowyMianownik);
            } else stataic if(op == "/") {
                if(a.licznik == 0) writefln("Nie można dzielić przez 0!")
                int nowyLicznik = this.licznik * a.mianownik;
                int nowyMianownik = this.mianownik * a.licznik;
                return new LiczbaWymierna(nowyLicznik, nowyMianownik);
            }
        }

I w przypadku jeśli licznik = 0 czy jest jakiś sposób na zakończenie tej funkcji po wyświetleniu komunikatu o tym błędzie ?

Tak samo w sumie w konstruktorze, bo póki co ustawiłem takie coś, że informuje, że mianownik jest równy 0 i zmieniam go domyślnie na 1. Czy jest sposób, żeby przerwać działanie konstruktora ?

komentarz 29 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

Wyjątki będą dobrym wyborem. https://dlang.org/library/object/exception.html

Podobne pytania

0 głosów
0 odpowiedzi 118 wizyt
pytanie zadane 31 sierpnia 2020 w Inne języki przez poldeeek Mądrala (5,980 p.)
+1 głos
2 odpowiedzi 1,368 wizyt
pytanie zadane 20 listopada 2015 w Offtop przez NaviFox Dyskutant (8,950 p.)
–2 głosów
0 odpowiedzi 142 wizyt
pytanie zadane 14 grudnia 2019 w C i C++ przez JACOBSSSPRO Początkujący (410 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...