在数组中保存指针

C++ Save pointers in an array

本文关键字:指针 保存 数组      更新时间:2023-10-16

我有一个叫做figGeom的类。circulo类继承自figGeom

我需要创建一个类,允许我在数组中保存类型为figGeom的对象指针。你能帮我吗?

我也有兴趣知道如何添加指针或内存地址到数组。

注意:我也有rectangletriangle类,但我删除了它们,使帖子更短,更可读。

我当前的代码给了我一个错误。

figuraGeom.h

#define TRIANGULO 0
#define RECTANGULO 1
#define CIRCULO 2
class figGeom
{
    double area;
    int tipoFig;
public:
    figGeom();
    figGeom(int);
    void setArea(double);
    double getArea();
    void setTipoFig(int);
    int getTipoFig();
    virtual double calcArea()=0;
    virtual void toString()=0;
};

class circulo:public figGeom
{
    //atributos
    double radio;
public:
    circulo();
    circulo(double);
    void setRadio(double);
    double getRadio();
    double calcArea();
    void toString();
};

figuraGeom.cpp

#include "figuraGeom.h"
#define _USE_MATH_DEFINES
#include <Math.h>
#include <string>
#include <iostream>
using namespace std;
//FIGGEOM
//Dispositivo
figGeom::figGeom(){}
figGeom::figGeom(int itipoDis){
    setTipoFig(itipoDis);
}
void figGeom::setArea(double iArea){area = iArea;}
double figGeom::getArea(){return area;}
void figGeom::setTipoFig(int iTipoDis){tipoFig = iTipoDis;}
int figGeom::getTipoFig(){return tipoFig;}
//CIRCULO
circulo::circulo(){}
circulo::circulo(double iRadio):figGeom(CIRCULO){setRadio(iRadio);}
void circulo::setRadio(double iRadio){radio = iRadio;}
double circulo::getRadio(){return radio;}
double circulo::calcArea(){return M_PI*pow(getRadio(),2);}
void circulo::toString(){cout << endl << endl << "  Tipo Figura: Circulo" << endl << endl;}

//LISTA FIGURAS
listaFiguras::listaFiguras(){
    *lista = NULL;
   setNumElementos(0);                          
} 
listaFiguras::~listaFiguras(){
    vaciarLista();
}
void listaFiguras::setNumElementos(int iNum){numElementos = iNum;}
int listaFiguras::getNumElementos(){return numElementos;}
void listaFiguras::vaciarLista()
{
    free(lista);
}

main.cpp

#include "figuraGeom.h"
#include <iostream>
using namespace std;
int tipoFig; 
char opcion;
figGeom * dI = NULL;
listaFiguras* listaFig = new listaFiguras();
void menu();
void menu_add_figura();
figGeom* pedirTriangulo();
figGeom* pedirRectangulo();
figGeom* pedirCirculo();
void menu();
void main()
{
    setlocale(LC_ALL, ""); //Configuración Regional
    menu();
}

void menu()
{
    do{
        cout << "SELECCIONA UNA OPCIÓN" << endl;
        cout << " [1]Añadir elemento" << endl;
        cout << " [2]Ver elemento" << endl;
        cout << " [3]Eliminar elemento" << endl;
        cout << " [4]Ver todos los elementos" << endl;
        cout << " [5]Eliminar todos los elementos" << endl << endl;
        cout << " [6]Salir" << endl << endl;
        cout << "Opción: ";
        cin >> opcion;
        switch (opcion){
                    case '1':
                        menu_add_figura();
                        break;
                    case '2': 
                        break;
                    case '3':
                        break;
            }
    }while(opcion != '6');
}

void menu_add_figura()
{
do{
        system("cls"); //limpiamos pantalla
        cout << "¿Qué tipo de figura desea crear?" << endl;
        cout << " [1]Triangulo" << endl;
        cout << " [2]Rectangulo" << endl;
        cout << " [3]Circulo" << endl;
        cout << " [4]Salir" << endl << endl;
        cout << "Figura: ";
        cin >> opcion;
        //PUNTERO AUX
        //listaFiguras-
        int new_numElem = (listaFig->getNumElementos()) + 1;
        listaFig->setNumElementos(new_numElem);
        figGeom** vector = new figGeom*[new_numElem];
        switch (opcion){
                case '1':
                    dI = pedirTriangulo(); //dI
                    *vector[new_numElem-1] = *dI;
                    break;
                case '2': 
                    dI = pedirRectangulo(); //dI
                    *vector[new_numElem-1] = *dI;
                    break;
                case '3':
                    dI = pedirCirculo(); //dI
                    *vector[new_numElem-1] = *dI;
                    break;
        }
        if(opcion != '4')
        {
            //cout << endl << " Area: " << dI->calcArea() << endl << endl; //Mostrar area
            cout << endl << " Area: " << vector[new_numElem-1]->calcArea << endl << endl; //Mostrar area
            system("pause"); //pausa
            system("cls"); //limpiamos pantalla
        }else delete dI;
    }while(opcion != '4');
}
figGeom* pedirCirculo()
{
    int radio;
    cout << " -Radio: ";
    cin >> radio;
    figGeom* dIaux;
    dIaux = new circulo(radio);
    return dIaux;
}
  1. 不要使用原始指针。使用原始指针通常会导致内存泄漏。相反,使用c++ 11(或Boost)的各种智能指针类,如std::unique_ptrstd::shared_ptr。它们将处理删除不再需要的对象的问题。

    #include <memory>
    std::shared_ptr<figGeom> createFigure()
    {
        std::shared_ptr<figGeom> thing(new figGeom(/* whatever */));
        return thing;
    }
    
  2. 您不需要使用简单的数组,当然也不需要编写自己的容器类。相反,使用标准库中的众多容器之一…它们速度快,效率高,可以处理自己的内存分配和释放,也许最重要的是,它们已经经过了很好的测试。std::vectorstd::array就可以了…如果只在运行时知道容器的大小,则使用向量;如果在编译时知道容器的大小,则使用数组。这两个容器都可以像标准的简单数组一样被访问。

    #include <vector>
    std::vector<std::unique_ptr<figGeom>> createFigures()
    {
        std::vector<std::unique_ptr<figGeom>> figures;
        figures.push_back(createFigure());
        figures[0].setArea(1234.56);
        return figures;
    }
    
  3. 有了这样一个简单、轻量级的类,你根本不需要使用new…您可以在堆栈上分配实例,并在需要时将它们复制到容器中。

    figGeom createShape()
    {
        figGeom shape(/* whatever */);
        return shape;
    }
    std::vector<figGeom> createShapes()
    {
        std::vector<figGeom> shapes;
        shapes.push_back(createShape());
        return shapes;
    }
    

你可以这样做:

figGeom* array[10];// change 10 to any number you need

然后创建指向circulo类的指针并将其保存在数组

for(int i=0;i<10;i++){
  array[i] = new circulo(/*parameters to constructor*/);
}

处理完对象后,应该释放内存

for(int i=0;i<10;i++){
  delete array[i];// Note, your destructor in figGeom class should be virtual
}