在数组中保存指针
C++ Save pointers in an array
我有一个叫做figGeom
的类。circulo
类继承自figGeom
。
我需要创建一个类,允许我在数组中保存类型为figGeom
的对象指针。你能帮我吗?
我也有兴趣知道如何添加指针或内存地址到数组。
注意:我也有rectangle
和triangle
类,但我删除了它们,使帖子更短,更可读。
我当前的代码给了我一个错误。
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;
}
-
不要使用原始指针。使用原始指针通常会导致内存泄漏。相反,使用c++ 11(或Boost)的各种智能指针类,如
std::unique_ptr
或std::shared_ptr
。它们将处理删除不再需要的对象的问题。#include <memory> std::shared_ptr<figGeom> createFigure() { std::shared_ptr<figGeom> thing(new figGeom(/* whatever */)); return thing; }
-
您不需要使用简单的数组,当然也不需要编写自己的容器类。相反,使用标准库中的众多容器之一…它们速度快,效率高,可以处理自己的内存分配和释放,也许最重要的是,它们已经经过了很好的测试。
std::vector
或std::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; }
-
有了这样一个简单、轻量级的类,你根本不需要使用
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
}
相关文章:
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何访问由共享指针保存的类方法?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 是否可以保存带有参数的函数指针以供以后使用?
- 如何在C++中使用 void* 在指针作为对方法的引用传递时保存uint32_t的值
- 指向结构变量的指针未保存到eeprom
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- 在循环迭代期间将引用保存到矢量中的空指针
- 使用函数指针时,ESP 未在函数调用中正确保存
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- 我可以将某些对象的指针保存在向量中,而不是将指针调用内联函数
- 如何将指针保存到班级的每个对象
- 使用指向文件的指针保存矢量中的对象
- 班上的指针并将指针保存在数组中
- 在函数中创建值,然后将指针保存在全局指针数组中的值上
- 如何将指向基类的指针保存到另一个类的字段
- Do C/C++指针保存用户数据
- C/C++指针技巧(将指针保存到int,并转换回)