2016-04-06 55 views
0

使用继承类,我正在计算3D形状的面积和面积。我现在需要访问数组确定形状,然后确定是否计算面积或形状的体积。最终目标是循环并提供输出,说明形状的名称区域和/或体积。我如何访问数组的对象名称?由于从数组访问对象名称

/--------------------------------------------------------- 
#ifndef SHAPE_H 
#define SHAPE_H 

const double PI = 3.14159265359; 
//Base Class--------------------------------------------- 
Class Shape { 
    protected: 
     //Dimensions 
     int dimensions; 
     double area; 
     double volume; 
    public: 
     //Default Constructor 
     Shape(); 
     //Destructor 
     ~Shape(); 
     //Get Dimension function 
     double getDimensions(); 
     //virtual function 
     virtual double getArea(); 
     virtual double getVolume(); 
}; 
//Shape Type----------------------------------------------- 
class TwoDimensionalShape : public Shape { 
    protected: 
     double d1, d2; 
    public: 
     double get_d1() { return d1; } 
     double get_d2() { return d2; } 
     double set_d1(double x) { d1 = x; } 
     double set_d2(double x) { d2 = x; } 
}; 
class ThreeDimensionalshape : public Shape { 
    protected: 
     double d1, d2, d3; 
    public: 
     double get_d1() { return d1; } 
     double get_d2() { return d2; } 
     double get_d3() { return d3; } 
     double set_d1(double x) { d1 = x; } 
     double set_d2(double x) { d2 = x; } 
     double set_d3(double x) { d3 = x; } 
}; 
//two dimensionals Shape classes------------------------- 
class Circle : public TwoDimensionalShape { 
    public: 
     Circle(); //default constructor 
     Circle(double r); //regular constructor 
     double getArea(); //get area function 
}; 
class Square : public TwoDimensionalShape { 
    public: 
     Square(); 
     Square(double dim); 
     double getArea(); 
}; 
class Triangle : public TwoDimensionalShape { 
    public: 
     Triangle(); 
     Triangle(double dim, double dim2); 
     double getArea(); 
}; 
//three dimensional shape classes------------------------- 
class Sphere : public ThreeDimensionalshape { 
    public: 
     Sphere(); 
     Sphere(double dim); 
     double getArea(); 
     double getVolume(); 
}; 
class Cube : public ThreeDimensionalshape{ 
    public: 
     Cube(); 
     Cube(double dim); 
     double getArea(); 
     double getVolume(); 
}; 
class Tetrahedron : public ThreeDimensionalshape{ 
    public: 
     Tetrahedron(); 
     Tetrahedron(double dim); 
     double getArea(); 
     double getVolume(); 
}; 

-

//--------------------------------------------------------- 
#include <stdlib.h> 
#include <cmath.h> 

#include "shape.h" //header file 

using namespace std; 
//---------------------------------------------- 
//Default constructor 
Shape::Shape() : dimensions(0), area(0), volume(0) { } 
//Regular constructor 
Shape::Shape(int d) : { 
    dimensions = d; 
} 
//Function getDimensions 
double Shape::getDimensions() { 
    return dimensions; 
} 

//Two dimensional shapes----------------------------------- 
//Default constructor-------------------- 
Circle::Circle() { 
    d1 = 1 ; 
} 
//Regular constructor-------------------- 
Circle::Circle(double r) { 
    d1 = r; 
} 
//Circle area 
double Circle::getArea() { 
    area = PI * pow(d1, 2); 
    return area; 
} 
//Default constructor-------------------- 
Square::Square() { 
    d1 = 1 ; 
    d2 = 1; 
} 
//Regular constructor-------------------- 
Square::Square(double dim){ 
    d1 = dim; 
    d2 = dim; 
} 
//Square area 
double Square::getArea(){ 
    area = pow(d1, 2); 
    return area; 
} 
//Default constructor-------------------- 
Triangle::Triangle(){ 
    d1 = 1; 
    d2 = 1; 
} 
//Regular constructor-------------------- 
Triangle::Triangle(double dim, double dim2){ 
    d1 = dim; 
    d2 = dim2; 
} 
//Triangle area 
double Triangle::getArea(){ 
    area = (d1 * d2)/2; 
} 
//Three dimensional shapes----------------------------------- 
//Default constructor--------------------- 
Sphere::Sphere(){ 
    d1 = 1; 
    d2 = 1; 
    d3 = 1; 
} 
//Regular constructor--------------------- 
Sphere::Sphere(double dim) : { 
    d1 = dim; 
    d2 = dim; 
    d3 = dim; 
} 
//Sphere area 
double Sphere::getArea(){ 
    area = 4 * PI * pow(d1, 2); 
    return area; 
} 
//Sphere volume 
double Sphere::getVolume(){ 
    volume = (4/3) * PI * pow(d1, 3); 
    return volume; 
} 
//Default constructor--------------------- 
Cube::Cube(){ 
    d1 = 1; 
    d2 = 1; 
    d3 = 1; 
} 
//Regular constructor--------------------- 
Cube::Cube(double dim){ 
    d1 = dim; 
    d2 = dim; 
    d3 = dim; 
} 
//Cube area 
double Cube::getArea(){ 
    area = pow(d1, 2); 
    return area; 
} 
//Cube Volume 
double Cube::getVolume(){ 
    volume = pow(d1, 3); 
    return volume; 
} 
//Default constructor--------------------- 
Tetrahedron::Tetrahedron(){ 
    d1 = 1; 
    d2 = 1; 
    d3 = 1; 
} 
//Regular constructor--------------------- 
Tetrahedron::Tetrahedron(double dim){ 
    d1 = dim; 
    d2 = dim; 
    d3 = dim; 
} 
//tetrahedron area 
double Tetrahedron::getArea(){ 
    area = sqrt(3) * pow(d1, 2); 
    return area; 
} 
//tetrahedron volume 
double Tetrahedron::getVolume(){ 
    volume = pow(d1, 3)/(6 * sqrt(2)); 
    return volume; 
} 

-

/--------------------------------------------------------- 
#include <stdlib.h> 
#include <cmath.h> 

#include "shape.h" //header file 

using namespace std; 

int main() { 
//Pointer Array-------------------------------------------- 
    Shape* arr[6]; 
//Assign Shape Dimensions and to Array 
    Circle cir(2); //declares value for circle ~ cir is var name 
     arr[0] = &cir; //assigns cir var to array position 0 
    Square sqr(3); 
     arr[1] = &sqr; 
    Triangle tri(4, 2); 
     arr[2] = &tri; 
    Sphere sph(5); 
     arr[3] = &sph; 
    Cube cb(6); 
     arr[4] = &cb; 
    Tetrahedron trhd(7); 
     arr[5] = &trhd; 
//Loop each index of array and perform calculation 
    for (int i = 0; i < 6; ++i) 
    { 
     cout << "" 
    } 
} 
+0

您的代码不能编译,它有很多错误。 –

+0

你可以添加一个'isThreeDimensional'成员函数。或者'getDimensions',如果你期望有1D或4D的形状。 – immibis

+0

为什么您需要将2D和3D形状保持在同一阵列中? –

回答

0

我建议像toString方法讲一下你的Shape类,并尝试重写它在你的继承类,比如:

Class Shape{ 
... 
public: 
std::string toString(); 
... 
} 

I mplement和覆盖它的子类:通过多态性的力量

std::string Shape::toString() 
{ 
    return "This is a simple shape"; 
} 

std::string Cube::toString() 
{ 
    return "Cube"; 
} 

... 

,你会在你的循环只是通过调用获取对象名称:

cout << arr[i].toString() << ... 
+0

我应该将对象的名称与参数一起放在构造函数中,还是将它分开并使用tostring()或将其命名为getName()作为方法? @Pooya – Bigboy6

+0

@ Bigboy6你想要使用什么机制,你需要向Shape类声明一个函数(toString或getName)并在较低的类中覆盖它,这样你就可以使用多态性 – Pooya