私はまだ C++ に慣れていないので、最初にコードの長いスパムについてお詫びしたいと思います。
私は実際に正方形やその他の形状の面積を計算するためにポリフォミズムを使用していますが、実際にこの方法でオブジェクトを動的に作成するにはどうすればよいですか? 実際に 3 つの異なる形状すべてを 1 つのベクトルに格納できるようにして、この後で並べ替えを実行できるようにしました。また、これを正しく行っているかどうかもわかりません..
親切にアドバイスしてください。
Shape2DLink.h
#ifndef Shape2DLink_H
#define Shape2DLink_H
#include "ShapeTwoD.h"
#include <iostream>
#include <string>
#include <vector>
#include <memory>
using namespace std;
class Shape2DLink:public ShapeTwoD
{
public:
int getx();
int gety();
double getArea();
void InputSensor();//allow user to input data
void StoreData();
vector<unique_ptr<ShapeTwoD>> objs;
};
#endif
Shape2DLink.cpp
ShapeTwoD shape2D;
Square square;
Rectangle rect;
Cross cross;
Shape2DLink shape2dlink;
void Shape2DLink::InputSensor()
{
string shape,type;
cout<<endl<<"\n"<<"[ Input sensor data ]"<<endl;
cout << "Please enter name of shape: " << endl;
cin >> shape;
shape2D.setName(shape);
cout << "Please enter special type : " << endl;
cin >> type;
shape2D.setWarpSpace(type);
if(shape == "Square")
{
square.setSquareCord();
square.computeArea();
objs.push_back(new Square(square));
}
else if(shape =="Rectangle")
{
rect.setRectCord();
rect.computeArea();
objs.push_back(new Rectangle(rectangle));
}
else if(shape == "Cross")
{
cross.setCrossCord();
cross.computeArea();
objs.push_back(new Cross(cross));
}
}
ShapeTwoD.h (親クラス)
class ShapeTwoD
{
public:
string name, warpSpace;
bool containsWarpSpace;
int xCord, yCord;
int xVal, yVal;
int length, breath;
double area;
//public:
//constructor
ShapeTwoD();
ShapeTwoD(string, bool);
//accessors/set function
void setName(string);
void setValues(int, int);
bool setContainsWarpSpace();
void setWarpSpace(string);
//mutator/get function
string getName();
bool getContainsWarpSpace();
string getWarpSpace(); //get value of warpspace
//methods
string toString();
virtual double computeArea();
bool isPointInShape(int x, int y);
bool isPointOnShape(int x, int y);
int xvalue[4];
int yvalue[4];
};
ShapeTwoD.cpp
using namespace std;
ShapeTwoD::ShapeTwoD()
{
string name = "";
bool containsWarpSpace = true;
}
ShapeTwoD::ShapeTwoD(string ShapeName, bool warpspace)
{
name = ShapeName;
containsWarpSpace = true;
}
void ShapeTwoD::setName(string shapeName)
{
name=shapeName;
}
string ShapeTwoD::getName()
{
return name;
}
string ShapeTwoD::toString()
{
string s;
return s;
}
void ShapeTwoD::setValues(int a, int b)
{
length = a;
breath = b;
}
bool ShapeTwoD::setContainsWarpSpace()
{
string warp;
if(warp=="WS")
containsWarpSpace=true;
else if(warp=="NS")
containsWarpSpace=false;
}
bool ShapeTwoD::getContainsWarpSpace()
{
return containsWarpSpace;
}
void ShapeTwoD::setWarpSpace(string space)
{
warpSpace=space;
}
string ShapeTwoD::getWarpSpace()
{
return warpSpace;
}
double ShapeTwoD::computeArea()
{
return area=0.00;
}
bool ShapeTwoD::isPointInShape(int x,int y)
{
xCord = x;
yCord = y;
if(xCord > 5 || yCord > 5)
{
return false;
}
else
{
return true;
}
}
bool ShapeTwoD::isPointOnShape(int x,int y)
{
xCord = x;
yCord = y;
if(xCord > 10 || yCord <10)
{
return false;
}
else
{
return true;
}
}
正方形.cpp
Square::Square()
{
xVal = 0;
yVal = 0;
}
Square::Square(string ShapeName, bool warpspace, int xval, int yval):ShapeTwoD(ShapeName, warpspace), xVal(xval), yVal(yval)
{
xVal = xval;
yVal = yval;
}
void Square::setSquareCord()
{
for (int i=0; i<4; i++)
{
cout << "Please enter x-ordinate of pt " << i+1 << ": ";
cin >> xVal;
xvalue[i] = xVal;
cout << endl;
cout << "Please enter y-ordinate of pt " << i+1 << ": ";
cin >> yVal;
yvalue[i] = yVal;
cout << endl;
}
}
double Square::computeArea()
{
int xmax = xvalue[1];
int xmin = xvalue[1];
int ymax = yvalue[1];
int ymin = yvalue[1];
for(int i=0; i<4; i++)
{
if(xvalue[i]>xmax)
{
xmax = xvalue[i];
}
else if(xvalue[i]<xmin)
{
xmin = xvalue[i];
}
}
for(int i=0; i<4; i++)
{
if(yvalue[i]>ymax)
{
ymax = yvalue[i];
}
else if(yvalue[i]<ymin)
{
ymin = yvalue[i];
}
}
length = xmax - xmin;
breath = ymax - ymin;
area = length * breath;
return (area);
}
rect.h
class Rectangle:public ShapeTwoD
{
private:
int xVal,yVal;
int length, breath;
double area;
public:
Rectangle();
Rectangle(string, bool, int, int);
//mutator method
//void setRectDetails(int x, int y);
void setRectCord();
//acessor method
//int getRectDetails();
int getxCord();
int getyCord();
bool isPointInShape(int x, int y);
bool isPointOnShape(int x, int y);
string toString();
double computeArea();
int xvalue[4];
int yvalue[4];
};
rect.cpp
Rectangle::Rectangle()
{
xVal = 0;
yVal = 0;
}
Rectangle::Rectangle(string ShapeName, bool warpspace, int xval, int yval):ShapeTwoD(ShapeName, warpspace), xVal(xval), yVal(yval)
{
xVal = xval;
yVal = yval;
}
void Rectangle::setRectCord()
{
for (int i=0; i<4; i++)
{
cout << "Please enter x-ordinate of pt " << i+1 << ": ";
cin >> xVal;
xvalue[i] = xVal;
cout << endl;
cout << "Please enter y-ordinate of pt " << i+1 << ": ";
cin >> yVal;
yvalue[i] = yVal;
cout << endl;
}
}
double Rectangle::computeArea()
{
int xmax = xvalue[1];
int xmin = xvalue[1];
int ymax = yvalue[1];
int ymin = yvalue[1];
for(int i=0; i<4; i++)
{
if(xvalue[i]>xmax)
{
xmax = xvalue[i];
}
else if(xvalue[i]<xmin)
{
xmin = xvalue[i];
}
}
for(int i=0; i<4; i++)
{
if(yvalue[i]>ymax)
{
ymax = yvalue[i];
}
else if(yvalue[i]<ymin)
{
ymin = yvalue[i];
}
}
length = xmax - xmin;
breath = ymax - ymin;
area = length * breath;
return (area);
}
int Rectangle::getxCord()
{
return xVal;
}
int Rectangle::getyCord()
{
return yVal;
}
string Rectangle::toString()
{
string s;
int xord = getxCord();
int yord = getyCord();
stringstream convertX;
convertX << xord;
stringstream convertY;
convertY << yord;
string xResult = convertX.str();
string yResult = convertY.str();
s += "Coordinate is: " + xResult + "";
s += "," + yResult + "\n";
return s;
}
bool Rectangle::isPointOnShape(int x,int y)
{
x = getxCord();
y = getyCord();
if(x > 3 || y > 3)
{
return true;
}
else
{
return false;
}
}
bool Rectangle::isPointInShape(int x,int y)
{
x = getxCord();
y = getyCord();
if(x > 5|| y >5)
{
return false;
}
else
{
return true;
}
}
cross.h
class Cross:public ShapeTwoD
{
private:
int xVal,yVal;
int length, breath;
double area;
public:
Cross();
Cross(string, bool, int, int);
//mutator method
//void setSquareDetails(int x, int y);
void setCrossCord();
//acessor method
//int getSquareDetails();
int getxCord();
int getyCord();
bool isPointInShape(int x, int y);
bool isPointOnShape(int x, int y);
string toString();
double computeArea();
int xvalue[12];
int yvalue[12];
};
cross.cpp
Cross::Cross()
{
xVal = 0;
yVal = 0;
}
Cross::Cross(string ShapeName, bool warpspace, int xval, int yval):ShapeTwoD(ShapeName, warpspace), xVal(xval), yVal(yval)
{
xVal = xval;
yVal = yval;
}
void Cross::setCrossCord()
{
for (int j=0; j<12; j++)
{
cout << "Please enter x-ordinate of pt " << j+1 << ": ";
cin >> xVal;
xvalue[j] = xVal;
cout << endl;
cout << "Please enter y-ordinate of pt " << j+1 << ": ";
cin >> yVal;
yvalue[j] = yVal;
cout << endl;
}
}
double Cross::computeArea()
{
int points = 12;
int running_total =0;
int i;
running_total = 0;
for (i=0; i<points-1; i++)
{
running_total += xvalue[i]*yvalue[i+1] - xvalue[i+1]*yvalue[i]; //cross calculation of coord in a cross
} //(x1*y2)-(y1*x1)
running_total += xvalue[points-1]*yvalue[0] - xvalue[0]*yvalue[points-1]; // traverse back to the origin point (xn*y1)-(yn*x1)
area = abs(running_total / 2); //purpose of absolute is to make sure result is positive.
//polygon are specified in counter-clockwise order (i.e. by the right-hand rule), then the area will be positive.
//cout << area;
return (area);
}
int Cross::getxCord()
{
return xVal;
}
int Cross::getyCord()
{
return yVal;
}
string Cross::toString()
{
string s;
int xord = getxCord();
int yord = getyCord();
stringstream convertX;
convertX << xord;
stringstream convertY;
convertY << yord;
string xResult = convertX.str();
string yResult = convertY.str();
s += "Coordinate is: " + xResult + "";
s += "," + yResult + "\n";
return s;
}
bool Cross::isPointOnShape(int x,int y)
{
x = getxCord();
y = getyCord();
if(x > 3 || y > 3)
{
return true;
}
else
{
return false;
}
}
bool Cross::isPointInShape(int x,int y)
{
x = getxCord();
y = getyCord();
if(x > 5|| y >5)
{
return false;
}
else
{
return true;
}
}