• 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++)

0 głosów
854 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 (158,960 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ź 1,016 wizyt
pytanie zadane 6 marca 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
0 odpowiedzi 270 wizyt
0 głosów
1 odpowiedź 514 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...