Przeladowanie operatorów, klopot

0
#include <iostream>

using namespace std;

class Resip
{
private:
    double sum;
public:
    Resip():sum(0.0){}
    Resip(double s):sum(1.0/s){}
    void operator+= (double a)
    {
        sum+=1.0/a;
    }
    friend bool operator< (Resip s1, Resip s2);
};

bool operator< (Resip s1,Resip s2)
{
    return s1.sum<s2.sum;
}

int main()
{
    Resip Sum1();
    Resip Sum2(2);
    Sum1+=3;
    Sum2+=4;
    if(Sum1<Sum2) cout << "Sum1 is less than Sum2" << endl;
    return 0;
}
 

Dlaczego program się nie kompiluje? Coś jest nie tak z przeładowanie operatorów, ale nie mogę rozgryźć co.

6
  1. Dlaczego nikt nie odpowiada w moim wątku? - na przyszłość podawaj numer linii i komunikat błędu
  2. Resip Sum1(); MVP: https://en.wikipedia.org/wiki/Most_vexing_parse
  3. void operator+= (double a), głupio. operator+= powinien zwracać *this (i adekwatny typ).
0

Dobra. Dzięki. Nie rozumiem do końca tylko punktu nr 2. Jaka tam jest niejednoznaczność? Przecież chyba widać że wywołuje konstruktor klasy Resip.

3

Nie, deklarujesz funkcję Sum1, zwracającą Resip i przyjmującą 0 argumentów. Wyrzuć () i będzie ok

0
 #include <iostream>

using namespace std;

class samochod
{
public:
    int moc;
    samochod():moc(5){}
};

int main()
{
    samochod nowy();
    return 0;
}

A dlaczego w tym programie kompilator nie myśli, że deklaruję funkcję nowy?

5

Jak najbardziej myśli. Spróbuj wypisać na ekran nowy.moc :)

0

Czyli rozumiem, że taka sytuacja zawsze występuje przy definiowaniu statycznym obiektów? Natomiast gdy się definiuje obiekty przy użyciu wskaźników to już wszystko jest w porządku z tego co widzę.

#include <iostream>

using namespace std;

class samochod
{
public:
    int moc;
    samochod():moc(5){}
};

int main()
{
    samochod *n=new samochod();
    cout << n->moc << endl;
    return 0;
}
 
5

Masz to dokładnie opisane w artykule na Wikipedii, który podlinkowałem. W skrócie: jeśli można to zinterpretować jako deklarację funkcji - tak zostanie to zinterpretowane.

Używanie nagiego new i delete w nowoczesnym C++ to antyidiom i powinieneś tego unikać. Są inteligentne wskaźniki (unique_ptr, shared_ptr), masz kontenery (vector, map, array). Naprawdę lista powodów używania new i delete bezpośrednio przez programistę jest bardzo krótka i zarezerwowana prawie wyłącznie dla ekspertów.

Powyższy problem można rozwiązać po prostu pomijając (zbędne) nawiasy przy definicji: samochod nowy. Albo, korzystając z wprowadzonej w C++11 Uniform Initialization: samochod nowy{};.

1 użytkowników online, w tym zalogowanych: 0, gości: 1