Klasa abstrakcyjna problem

0

Oto część kodu, otrzymuję komunikat "lab3.z1.cpp:76: error: request for member ‘field’ in ‘jakasfigura’, which is of non-class type ‘PlaneFigure*’"
Czy mogę prosić o jakąś podpowiedź? Z góry dziękuję

class PlaneFigure
{
    public:
        virtual double field() = 0;
        virtual double circut() = 0;
 
};
 
 
class Square : public PlaneFigure
{
    protected:
        double A;
 
    public:
        Square(double a) : A(a) {}
 
        double field()
        {
            return A * A;
        }
 
        double circut()
        {
            return 4.0 * A;
        }
};
 
int main(int argc, char **argv)
{
    PlaneFigure *jakasfigura = 0;
    jakasfigura = new Square(2);
    std::cout << jakasfigura.field();
 
    return 0;
}
0

jakasfigura jest wskaźnikiem, więc do jej składowych musisz się odnosić operatorem ->

0

Wielkie dzięki:) Mam jeszcze takie pytanie, tych figur jest oczywiście kilka i zastanawiam się czy do wyświetlania wyników użyć funkcji zadeklarowanej poza klasą, czy również zadeklarować metodą, dodam, że chciałbym, żeby komunikaty się nieco różniły.

0

Możesz sobie utworzyć metodę, która zwraca string z wynikiem. Użytkownik zrobi z tym co zechce. Nie powinieneś bezpośrednio w klasie wyświetlać tego, bo zmniejszasz funkcjonalność.

0
omg napisał(a):

... żeby komunikaty się nieco różniły.

W przypadku kwadratu to: Pole wynosi 10
Zaś w przypadku trójkąta: Field is 10
Właśnie po to istnieje polimorfizm aby wyeliminować taką możliwość przez solidne utrudnienie tego.
Jeżeli zaś chcesz aby w wyniku pojawiła się nazwa figury to zrób kolejną metodę czystą:
const char *name()const { return "kwadrat"; }

omg napisał(a):

... czy do wyświetlania wyników użyć funkcji zadeklarowanej poza klasą, czy również zadeklarować metodą, dodam, że chciałbym, ...

Nigdy nie rób żadnych wyświetleń wyników w metodach klas no chyba że to klasa obsługująca jakiś wyświetlacz wyników.

0

Szczerze mówiąc to się trochę pogubiłem, powiedzmy, że już sobie odpuszczę tą inną nazwę. Czyli mogę napisać funkcję np. void pokazwynik... poza klasą i to by było dobre rozwiązanie?

1

O ile taka funkcja jest potrzebna to tak.
Zaś jeżeli chcesz zrobić funkcję która robi jedynie to:
std::cout << "Pole figury wynosi " << figura->field() << std::endl;
to z prawdopodobieństwem 99% to jakiś bezsens.

0

Chciałbym, żeby wyświetlała i pole i obwód jednocześnie, nie jest to specjalnie potrzebne, ale taki miałem zamiar.

0

Niestety napotkałem kolejny problem a mianowicie, chciałbym wywołać metodę która znajduje się tylko w klasie trójkąt na przykład sprawdzenie czy jest prostokątny

0

Chce po prostu wywołać metodę klasy potomnej
figure = new Triangle(a, b, c);
a teraz chciałbym się odwołać to metody która sprawdza czy trójkąt jest prostokątny znajduje się ona tylko w klasie potomnej

0

Jak dla mnie (skoro masz pewność, że w 'figure' jest obiekt klasy 'Triangle'), to najlepiej zrobić rzutowanie, tzn. tworzysz tak jak do tej pory, a w momencie kiedy chcesz tą metodę wywołać, to:
((Triangle *) figure)->metoda();
Wtedy będzie działać. Nie twierdzę, że to najlepsze rozwiązanie, ale chyba mogłoby być.

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