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

Zaprzyjaźnienie funkcji przeciążającej operator* (C++)

Object Storage Arubacloud
0 głosów
540 wizyt
pytanie zadane 3 sierpnia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Problem polega na tym, jest niezgodność z zaprzyjaźnioną funkcją operatora*. Funkcja posiada 2 argumenty i definicję. Sprawdzałem wiele artykułów i nie wiem gdzie leży błąd.

plik nagłówkowy:

#ifndef STONEWT_H_
#define STONEWT_H_

#include <iostream> // dla obiektu std::ostream
class Stonewt
{
        private:
                enum {Lbs_per_stn = 14}; //liczba funtów na kamienie
                int stone;               //masa w całych kamieniach
                double  pds_left;        //reszta w funtach
                double pounds;           //masa w funtach
        public:
                //konstruktory
                Stonewt();                       //kontruktor domyśny 
                Stonewt(double lbs);             //konstruktor dla funtów
                Stonewt(int stn, double lbs);    //konstruktor dla kamieni i funtów
                //przeciążenia
                Stonewt operator+(const Stonewt & value) const;          //przeciążenie operatora+ dla...
                Stonewt operator-(const Stonewt & value) const;             //przeciążenie operatora- dla...
                friend Stonewt operator*(double d_value, const Stonewt & value);             //przeciążenie operatora* dla...
                friend std::ostream & operator<<(std::ostream & os, const Stonewt & text); 
};

#endif

deklaracje:

#include "stonewt.h" // zawiera <iostream>

Stonewt::Stonewt() { stone = pounds = pds_left = 0; }
Stonewt::Stonewt(double lbs)
{
        stone = int (lbs) / Lbs_per_stn; //dzielenie całkowite
        pds_left = int (lbs) % Lbs_per_stn + lbs - int (lbs);
        pounds = lbs;
}
Stonewt::Stonewt(int stn, double lbs)
{
        stone = stn;
        pds_left = lbs;
        pounds = stn * Lbs_per_stn + lbs;
}

Stonewt Stonewt::operator+(const Stonewt & value) const { return Stonewt(stone + value.stone, pounds + value.pounds); }

Stonewt Stonewt::operator-(const Stonewt & value) const { return Stonewt(stone - value.stone, pounds - value.pounds); }

Stonewt operator*(double d_value, const Stonewt & value) { return value * d_value; }

std::ostream & operator<<(std::ostream & os, const Stonewt & text)
{
        os << "Masa w kamieniach: " << text.stone << " kamieni, " << text.pds_left << " funtów\n" << "Masa w funtach: " << text.pounds << " funtów\n";
        return os;
}

Proszę o podpowiedź co mogło pójść tutaj nie tak.

1
komentarz 4 sierpnia 2018 przez monika90 Pasjonat (22,940 p.)

enum {Lbs_per_stn = 14};

 Współcześnie tak się nie pisze, to relikt przeszłości. Obecnie robimy tak:

static constexpr int Lbs_per_stn = 14;

 

2 odpowiedzi

+1 głos
odpowiedź 4 sierpnia 2018 przez niezalogowany
wybrane 4 sierpnia 2018 przez Sic
 
Najlepsza

Ta funkcja chyba powinna wyglądać tak:

Stonewt operator*(double multiplier, const Stonewt & stonewt) 
{ 
    return Stonewt(
        multiplier * stonewt.stone, stonewt.pds_left
    ); 
}

Oba argumenty to dwa różne typy. Przykładowy main:


int main()
{
	Stonewt a(10, 0.1);
	std::cout << a << "\n";
	Stonewt b = 2.0*a;
	std::cout << b << "\n";
	//Stonewt b = a * 2.0; // error
	//std::cout << b << "\n";
}

Dobrze zrozumiałem problem?

komentarz 4 sierpnia 2018 przez Sic Dyskutant (8,510 p.)
To powinno rozwiązać problem i wykorzystam to. Dziękuję.

Jednak znalazłem pewne zadanie, w którym jest zrobione dokładnie tak samo i działa, a u mnie nie. Może to być wina kompilatora ?
komentarz 4 sierpnia 2018 przez niezalogowany
Hmmm wydaje mi się, że jednak coś było inaczej. Możesz rzucić linkiem to porównamy.
komentarz 4 sierpnia 2018 przez Sic Dyskutant (8,510 p.)
Znalazłem je w książce
+1 głos
odpowiedź 4 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)
W linii 21 w pliku *.cpp. Jak chcesz przemnożyć Stonewt przez wartość typu double? Drugie pytanie dotyczące tej linii to czy wiesz co powinieneś zwrócić z wyniku tej operacji? Sygnatura funkcji mówi wyraźnie że Stonewt a kompilator nie wie co ma być wynikiem mnożenia obiektu Stonewt i wartości double.
komentarz 4 sierpnia 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję bardzo już rozwiązuje ten problem.

Podobne pytania

+1 głos
1 odpowiedź 562 wizyt
pytanie zadane 6 marca 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
0 odpowiedzi 164 wizyt
0 głosów
1 odpowiedź 210 wizyt

92,567 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 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!

...