How Can You Explore Area and Descriptions of Shapes in Programming?

  • Thread starter Thread starter ghost305
  • Start date Start date
  • Tags Tags
    Area Shapes
AI Thread Summary
The discussion centers on a C++ implementation of a shape hierarchy using polymorphism, where the base class `Shape` defines pure virtual functions for calculating area and generating a string description. Derived classes include `square`, `rectangle`, and `circle`, each implementing these functions. Issues arise in the `getShape()` function, where the local array `myShape` of shape pointers goes out of scope after the function returns, leading to undefined behavior. Suggestions include passing shape objects as parameters to `getShape()` to maintain their validity beyond the function's scope. The importance of managing object lifetimes and memory in C++ is emphasized, particularly in relation to dynamic memory allocation and object ownership.
ghost305
Messages
14
Reaction score
0
Code:
#ifndef SHAPE_H
#define SHAPE_H

#include <string.h>
using std::string;

using namespace std;



class Shape

{
public:
	Shape(const string &color); //constructor
	~Shape();
	string getColor()const; //returns objects color value
	virtual double area()const = 0;// a const pure virtual member function that computes and returns the object's area
	virtual string toString() const = 0; //a const pure virtual member function that returns the shape's description
private:
	string s_color;

};


#endif //SHAPE_H

#include <string>
using std::string;

#include <sstream>

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "square.h"

//ctor
square::square(const string &color, double length)
:Shape(color)
{
	length = len;
}//end ctor

//dtor
double square::getLength()
{
	return len;
}
//Function to calculate are
double square::area()const
{
	return len * len;
}//end function to calculate area

//Function to returns square's description
string square::toString()const
{
  ostringstream os;
  os << getColor() <<"square with side length of " << len << " " << "and area of " << area();
  return os.str();

}//end of function to return's square description

#include <string>
using std::string;

#include <sstream>

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "rectangle.h"

//ctor
rectangle::rectangle(const string &color, double width, double length)
:Shape(color)
{
length = len;
wid = width;
}//end ctor

//dtor
double rectangle::getWidth()
{
	return wid;
}

double rectangle::getLength()
{
	return len;
}
//function to calculate rectangle area
double rectangle::area() const
{
	return len * wid;
}//end function to get rectangle area

//returns rectangle's description
string rectangle::toString()const
{
  ostringstream os;
  os << getColor() <<"rectangle with length of " << len << " and width of " << wid << " and area of " << area();
  return os.str();
}//end function to return rectangle's description


#include <string>
using std::string;

#include <sstream>

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "circle.h"

//ctor
circle::circle(const string& color, double radius)
:Shape(color)
{
	radius = rad;
}//end ctor

double circle::getRadius()
{
	return rad;
}
//function to calculate circle area
double circle::area()const
{
	return rad * rad * 3.14;
}//end function to get circle area

//returns circle description
string circle::toString()const
{
  ostringstream os;
  os << getColor() <<" circle with radius of " << rad << " and area of " << area();
  return os.str();
}//end function to return circle description


#include <string>
using std::string;

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include "circle.h"
#include "rectangle.h"
#include "square.h"


Shape* getShape()
{	


	int i;
	string shapetype;
	char choice;

	Shape* myShape[6];
	
	
	

	cout << "Creating a Shape  ";
	cout << "============================================== "<<endl;
	cout << " 1: Create a circle "<<endl;
	cout << " 2: Create a rectangle "<<endl;
	cout << " 3: Create a square "<<endl;
	cout << " 4: Done "<<endl;
	cout << "============================================== "<<endl;
	for ( i = 0; i < 6; ++i){
	cout << "Enter number for shapetype" <<endl;

	switch(choice){
	
	case '1':
	cout << "\nEnter the shape's color (or 'done')...";
	cin >>  s_color   ;
	cout << "\nEnter shape type..." ;
	cin >> shapetype;
	cout << "\nEnter radius... ";
	cin >> radius;
	myShape[i] = new circle(color, radius);
	break;
	
	case '2':
	cout << "\nEnter the shape's color (or 'done')...";
	cin >> color;
	cout << "\nEnter shape type...";
	cin >> shapetype;
	cout << "\nEnter the length and width...  ";
	cin >> width >> length;
	myShape[i] = new rectangle(color, length, width); 
	break;
	
	case '3':
	cout << "\nEnter the shape's color (or 'done')...";
	cin >> color;
	cout <<"\nEnter shape type...";
	cin >> shapetype;
	cout << "\nEnter the length of a side...";
	cin >> length;
	myShape[i] = new square(color, length);
	break;
	
	case '4':
	cout <<"\nEnter the shape's color (or 'done')...";
	cout << "done"<< endl;}

	}
	return myShape[i];

}

I try to run the function in int main(); with the function Shape* getShape(); but nothings comes up in the terminal.
 
Technology news on Phys.org
C:
Shape* getShape()
{    
    int i;
    string shapetype;
    char choice;

    Shape* myShape[6];    

    cout << "Creating a Shape  ";
    cout << "============================================== "<<endl;
    cout << " 1: Create a circle "<<endl;
    cout << " 2: Create a rectangle "<<endl;
    cout << " 3: Create a square "<<endl;
    cout << " 4: Done "<<endl;
    cout << "============================================== "<<endl;
    for ( i = 0; i < 6; ++i){
    cout << "Enter number for shapetype" <<endl;

    switch(choice){    
        <snip -- deleted long switch statement>  
    }
    return myShape[i];
}
myShape is an array of 6 pointers to Shape objects. It's a local variable, meaning it has automatic duration. This is crucial for what you're trying to do. Right after your final return statement, myShape essentially dies off, This means that whatever address you've stored in the array, of a circle, or a rectangle, or whatever, the whole array is reclaimed, so the return statement just sends back garbage.

A better way to do things would be to pass a Shape object as a parameter to your getShape() function, and have this function construct the appropriate type of shape.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Back
Top