Error with pointer when using dynamic_cast to detect derived class

I’d like to have some help on an issue I face.

I made an inheritance with polymorph program with class Shape and Circle (derived from shape). So I have some code like this

main.cpp

Shape* shape = new (nothrow) Shape[size]();
input_circle(shape);
show_circle_area(shape);

and a procedure in main.cpp too

void show_circle_area(Shape *mshape){
    int i;
    sort(mshape,mshape+totshape,sortByArea);
    cout << "CIRCLE" << endl;
    for (i=0;i<totshape;i++)
        if (dynamic_cast<Circle*> (mshape[i]))
            cout << mshape[i].getWidth() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
}

when I run this program, I always got this error :

main2.cpp: In function 'void output_circle(Shape*)':
main2.cpp:66:39: error: cannot dynamic_cast '*(mshape + ((sizetype)(((unsigned int)i) * 40u)))' (of type 'class Shape') to type 'class Circle*' (source is not a pointer)
   if (dynamic_cast<Circle*> (mshape[i]))
                                       ^

Anyone can help what should I do to fix this?

main.cpp

#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Square.h"
#include <fstream>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#include <limits>
#include <typeinfo>

using namespace std;
const int size = 200;
int totshape = 0;

// INPUT FROM FILE

void input_circle(Shape* mshape){
    ifstream file;
    int i;
    double r;
    file.open("circle.txt");
    while (file >> r){
        Circle crl(r);
        mshape[totshape]=crl;
        totshape++;
    }
    file.close();
}

void input_rectangle(Shape* mshape){
    ifstream file;
    int i;
    double w,h;
    file.open("rectangle.txt");
    while (file >> w >> h){
        Rectangle rec(w,h);
        mshape[totshape]=rec;
        totshape++;
    }
    file.close();
}

void input_square(Shape* mshape){
    ifstream file;
    int i;
    double s;
    file.open("square.txt");
    while (file >> s){
        Square sqr(s);
        mshape[totshape]=sqr;
        totshape++;
    }
    file.close();
}

//OUTPUT TO FILE

void output_circle(Shape *mshape){
    int i;
    ofstream file;
    file.open("outcircle.txt");
    file << "radiustareatperimeter" << endl;
    for (i=0;i<totshape;i++){
        if (dynamic_cast<Circle*> (mshape + i))
            file << mshape[i].getWidth() << "t" << mshape[i].getArea() << "t" << mshape[i].getPerimeter() << endl;
    }
    file.close();
}

void output_rectangle(Shape *mshape){
    int i;
    ofstream file;
    file.open("outrectangle.txt");
    file << "widththeighttareatperimeter" << endl;
    for (i=0;i<totshape;i++){
        if (dynamic_cast<Rectangle*> (mshape + i))
            file << mshape[i].getWidth() << "t" << mshape[i].getHeight() << "t" << mshape[i].getArea() << "t" << mshape[i].getPerimeter() << endl;
    }
    file.close();
}

void output_square(Shape *mshape){
    int i;
    ofstream file;
    file.open("outsquare.txt");
    file << "sisitareatperimeter" << endl;
    for (i=0;i<totshape;i++){
        if (dynamic_cast<Square*> (mshape + i))
            file << mshape[i].getWidth() << "t" << mshape[i].getArea() << "t" << mshape[i].getPerimeter() << endl;
    }
    file.close();
}

//SORTING STL FOR AREA AND PERIMETER

bool sortByArea(Shape lhs, Shape rhs) { 
    return lhs.getArea() < rhs.getArea(); 
}

bool sortByPerimeter(Shape lhs, Shape rhs){
    return lhs.getArea() < rhs.getArea();
}

//SHOW DATA SORT BY AREA

void show_shape_area(Shape *shape){
    int i;
    sort(shape,shape+totshape,sortByArea);
    cout << "ALL SHAPE" << endl;
    for (i=0;i<totshape;i++)
        cout << shape[i].getWidth() << " " << shape[i].getWidth() << " " << shape[i].getArea() << " " << shape[i].getPerimeter() << endl;
}

void show_circle_area(Shape *mshape){
    int i;
    sort(mshape,mshape+totshape,sortByArea);
    cout << "CIRCLE" << endl;
    for (i=0;i<totshape;i++)
        if (dynamic_cast<Circle*> (mshape + i))
            cout << mshape[i].getWidth() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
}

void show_rectangle_area(Shape *mshape){
    int i;
    sort(mshape,mshape+totshape,sortByArea);
    cout << "RECTANGLE" << endl;
    for (i=0;i<totshape;i++)
        if (dynamic_cast<Rectangle*> (mshape + i))
            cout << mshape[i].getWidth() << " " << mshape[i].getHeight() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
}

void show_square_area(Shape *mshape){
    int i;
    sort(mshape,mshape+totshape,sortByArea);
    cout << "SQUARE" << endl;
    for (i=0;i<totshape;i++)
        if (dynamic_cast<Square*> (mshape + i))
            cout << mshape[i].getWidth() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
}

//SHOW DATA SORT BY PERIMETER

void show_shape_perimeter(Shape *shape){
    int i;
    sort(shape,shape+totshape,sortByPerimeter);
    cout << "ALL SHAPE" << endl;
    for (i=0;i<totshape;i++)
        cout << shape[i].getWidth() << " " << shape[i].getWidth() << " " << shape[i].getArea() << " " << shape[i].getPerimeter() << endl;
}

void show_circle_perimeter(Shape *mshape){
    int i;
    //Shape * tempshape;
    sort(mshape,mshape+totshape,sortByPerimeter);
    cout << "CIRCLE" << endl;
    for (i=0;i<totshape;i++)
        //cout << "masuk for" << endl;
        //tempshape=&mshape[i];
        if (dynamic_cast<Circle*> (mshape + i)){
            cout << mshape[i].getWidth() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
            //cout << "masuk" << endl;
        }
}

void show_rectangle_perimeter(Shape *mshape){
    int i;
    sort(mshape,mshape+totshape,sortByPerimeter);
    cout << "RECTANGLE" << endl;
    for (i=0;i<totshape;i++)
        if (dynamic_cast<Rectangle*> (mshape + i))
            cout << mshape[i].getWidth() << " " << mshape[i].getHeight() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
}

void show_square_perimeter(Shape *mshape){
    int i;
    sort(mshape,mshape+totshape,sortByPerimeter);
    cout << "SQUARE" << endl;
    for (i=0;i<totshape;i++)
        if (dynamic_cast<Square*> (mshape + i))
            cout << mshape[i].getWidth() << " " << mshape[i].getArea() << " " << mshape[i].getPerimeter() << endl;
}

//ADD DATA
void add_circle(Shape *mshape){
    int input;
    cout << endl << "Masukkan jari-jari : ";
    while (!(cin >> input) || input < 0) // <<< note use of "short circuit" logical operation here
    {
        cout << "Input tidak valid" << endl;
        cout << "Masukkan jari-jari : ";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); // NB: preferred method for flushing cin
    }
    Circle crl(input);
    mshape[totshape]=crl;
    totshape++;
}

void add_rectangle(Shape *mshape){
    int inwidth, inheight;
    cout << endl << "Masukkan panjang : ";
    while (!(cin >> inwidth) || inwidth < 0) // <<< note use of "short circuit" logical operation here
    {
        cout << "Input tidak valid" << endl;
        cout << "Masukkan panjang : ";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); // NB: preferred method for flushing cin
    }
    cout << endl << "Masukkan lebar : ";
    while (!(cin >> inheight) || inheight < 0 || !(inheight < inwidth)) // <<< note use of "short circuit" logical operation here
    {
        cout << "Input tidak valid" << endl;
        cout << "Masukkan lebar : ";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); // NB: preferred method for flushing cin
    }
    Rectangle rec(inwidth,inheight);
    mshape[totshape]=rec;
    totshape++;
}

void add_square(Shape *mshape){
    int input;
    cout << endl << "Masukkan sisi : ";
    while (!(cin >> input) || input < 0) // <<< note use of "short circuit" logical operation here
    {
        cout << "Input tidak valid" << endl;
        cout << "Masukkan sisi : ";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n'); // NB: preferred method for flushing cin
    }
    Square sqr(input);
    mshape[totshape]=sqr;
    totshape++;
}

//DELETE DATA


//MAIN PROGRAM

int main(){
    Shape* shape = new (nothrow) Shape[size]();

    input_circle(shape);
    input_rectangle(shape);
    input_square(shape);

    show_shape_area(shape);
    show_shape_perimeter(shape);

    show_circle_area(shape);
    show_circle_perimeter(shape);

    show_rectangle_area(shape);
    show_rectangle_perimeter(shape);

    show_square_area(shape);
    show_square_perimeter(shape);

    return 0;
}


Source: oop

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.