【问题标题】:Accessing Object names from Array从数组访问对象名称
【发布时间】:2016-04-06 00:54:27
【问题描述】:

使用继承类,我希望计算 2d 形状的面积以及 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 << ""
    }
}

【问题讨论】:

  • 你的代码没有编译,有很多错误。
  • 您可以添加一个isThreeDimensional 成员函数。或者getDimensions,如果您也希望有 1D 或 4D 形状。
  • 为什么需要将 2D 和 3D 形状保持在同一个数组中?

标签: c++ arrays object for-loop


【解决方案1】:

我建议在您的 Shape 类中添加类似 toString 的方法,并尝试在继承的类中覆盖它,例如:

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

在子类中实现并覆盖它:

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

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

...

通过多态性的力量,您只需通过调用即可在 for 循环中获取对象名称:

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

【讨论】:

  • 我应该将对象的名称与参数一起放在构造函数中,还是将其分开并使用 tostring() 或将其命名为 getName() 作为方法? @Pooya
  • @Bigboy6 你想使用什么机制,你需要向 Shape 类声明一个函数(toString 或 getName)并在低类中覆盖它,这样你就可以使用多态性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2012-01-20
  • 2019-11-10
相关资源
最近更新 更多