Home > database >  Function only returning 1's for the area and disregards the formula?
Function only returning 1's for the area and disregards the formula?

Time:07-13

I am trying to calculate area of all shapes (rectangle, rhombus, triangle, circle) through using virtual and override methods. But when I execute the code it returns 1 for the area for all shapes even though I have tried with the rectangle to alter it to input the given area multiple times in int main() it still only outputs "My figure type is My area is 1 My figure type is Triangle My area is 1 My figure type is Circle My area is 1 My figure type is Rhombus My area is 1"

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class Figure
{
protected:
    double x;
    double y;
    string type;
public:
    Figure(double m_x, double m_y) : x{ m_x }, y{ m_y } {};
    virtual double area(double x, double y) { return 0; };
    Figure(double m_x, double m_y, double x = 0, double y = 0) { m_x = x; m_y = y; }
    virtual void Print() const final;
    Figure(const Figure& obj);
    Figure() {};    
};

class Rectangle : public Figure
{
public: 
    Rectangle(double x, double y)
    {
        this->x = x; 
        this->y = y; 
        type = " Rectangle"; 
        double area();
    }

    double area(double x, double y) override {
        return x * y;
    }

    Rectangle() {};
};

class Triangle : public Figure
{
public:
    Triangle(double x, double y)
    {
        this->x = x; 
        this->y = y; 
        type = " Triangle";
        double area();
    }

    double area(double x, double y)override {
        return x * y / 2;
    }

    Triangle() {};
};

class Circle : public Figure
{
public:
    Circle(double x, double y)
    {
        this->x = x; 
        this->y = y; 
        type = " Circle"; 
        double area();
    }

    double area(double x, double y)override {
        return pow(x, 2) * 3.14;
    }

    Circle() {};
};

class Rhombus : public Figure
{
public:
    Rhombus(double x, double y)
    {
        this->x = x; this->y = y; type = " Rhombus"; double area();
    }

    double area(double x, double y)override {
        return x * y / 2;
    }

    Rhombus() {};
};

void Figure::Print() const 
{
    cout << "    My figure type is" << type 
         << "   My area is " << &Figure::area;
}

int main()
{
    Rectangle rectangle;
    rectangle.area(5.4,6.2);
    rectangle.Print();
    Triangle triangle(4.5,5.3);
    triangle.Print();
    Circle circle(6.6, 8.8);
    circle.Print();
    Rhombus rhombus(3.4,5.4);
    rhombus.Print();
}

CodePudding user response:

You are getting 1 because a valid function pointer is treated as true.

You should call the function area like Figure::area(x, y) instead of getting the address of the function area like &Figure::area.

CodePudding user response:

it's simple. really. When you do rectangle.area(x, y); you just return the value you obtain from the variables that you passed in. You never assign a value to the x and y of the actual rectangle. So when you do print the area of the rectangle you use its real x and y, which do not have a value assigned to them, hence resulting in a 1. it's the same for the other shapes.

  •  Tags:  
  • c
  • Related