Interfejs porownania

0

Mam taki kod:

#include <iostream>
const float pi = 3.14159;

class Porownalne
{
public:
    virtual bool operator<(Porownalne& d) const =0;
};

class Shape: public Porownalne
{
public:
    virtual float field()
    {
        return -1.0;
    }
    bool operator<(Porownalne& d) const //Ta metoda w ogóle sie nie wywołuje
    {
        Shape& k = dynamic_cast<Shape&>(d);
        return true;
    }
};

class Square: public Shape
{
public:
    Square(const float side): a(side){}

    float field()
    {
        return a * a;
    }

private:
    float a;
};

class Circle: public Shape
{
public:
    Circle(const float diameter): a(diameter){}

    float field()
    {
        return pi * a;
    }

private:
    float a;
};

int main ()
{
    Shape* patternShape = new Circle(3);
    Shape* shape = new Square(3);

    if (patternShape < shape)
        std::cout<<"wzorcowy ksztalt jest mniejszy\n";
    else
        std::cout<<"wzorcowy ksztalt nie jest mniejszy\n";
}

Nie wiem dlaczego nie wywołuje mi funkcji bool operator<(Porownalne& d) const, a także jak w niej zaimplementować porównywanie:
patternShape < shape
w taki sposób, aby było porównywane patternShape->field() < shape->field()?

1

W klasie Porownalne (ang. Comparable) nie ma nic, co mogłoby pozwolić na porównywanie dwóch instancji takich klas. Mógłbym utworzyć klasę Proton oraz klasę ToiletPaper, które dziedziczyłyby po Comparable - w jaki sposób chciałbyś zaimplementować operator < w takim przypadku?

Dlatego właśnie ta klasa nadaje się jedynie do usunięcia; operator < wrzuć do klasy Shape, gdzie utwórz wirtualną metodę getArea (a nie żadne field!) - dzięki temu będziesz mógł dwie figury ze sobą porównywać, ponieważ będzie ich łączyło pole.

0

Porównujesz wskaźniki, a nie obiekty.

Co do porównania po field():

    bool operator<(Porownalne& d) const //Ta metoda w ogóle sie nie wywołuje
    {
        Shape& k = dynamic_cast<Shape&>(d);
        return field() < k.field();
    }

Przy czym wirtualne operatory to prawie zawsze jakiś problem w designie. Co chcesz osiągnąć?

0

Próbuję ogarnąć interfejsy, a konkretnie to chcę stworzyć koło i kwadrat, a później chcę mieć możliwość porównania ich pomimo, że to są różne obiekty.
Dokładniej mówiąc chciałbym porównywać ich pola powierzchni.
Ale może za bardzo przekombinowałem.

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