Gracias por responder CalgaryCorpus, pude solucionar el código, no te imaginas cuánto sufrí con este código por los punteros, pongo el código solucionado:
Agenda.h:
Código C++:
Ver original#ifndef AGENDA_H
#define AGENDA_H
#include <string>
#include <array>
class Agenda {
private:
int indice;
int tamanio;
Contacto *contactos;
public:
Agenda();
Agenda(int maxCont);
bool anyadirContacto(Contacto *);
Contacto* buscarPorNombre(std::string nombre);
Contacto* buscarPorTelefono(int telefono);
bool borrarPorNombre(std::string nombre);
bool modificarPorNombre(std::string nombre, int nuevoTelefono);
std::string toString();
};
#endif /* AGENDA_H */
Código C++:
Ver original#include "Contacto.h"
#include "Agenda.h"
#include <iostream>
#include <string>
using namespace std;
Agenda::Agenda(){}
Agenda::Agenda(int maxCont){
this->indice = 0;
this->tamanio = maxCont;
this->contactos = new Contacto[maxCont];
}
bool Agenda::anyadirContacto(Contacto *objcontacto) {
if(indice < tamanio){
contactos[indice] = *objcontacto;
indice++;
return true;
} else {
return false;
}
}
bool Agenda::borrarPorNombre(string nombre) {
for (int i = 0 ; i < indice; i++) {
if(&contactos[i] != NULL) {
string nom = this->contactos[i].getNombre();
if(nom == nombre){
delete[] std::addressof(contactos[i]);
for(int d = i; d < indice; d++){
contactos[i] = contactos[i + 1];
}
indice--;
return true;
}
}
}
return false;
}
string Agenda::toString(){
cout << "indice: " << indice << "\n";
string res ="";
int cont = 1;
for (int i = 0 ; i < indice; i++) {
res += "\n Contacto " + std::to_string(cont) + "\n" + contactos[i].toString();
cont++;
}
return res;
}
Contacto* Agenda::buscarPorNombre(string nombre) {
//for(Contacto* contacto : contactos){
for (int i = 0 ; i < tamanio; i++) {
Contacto* contacto = &contactos[i];
if (&contacto != NULL) {
string nom = contacto->getNombre();
if (nom == nombre) {
return contacto;
}
}
}
return NULL;
}
Contacto* Agenda::buscarPorTelefono(int telefono) {
for (int i = 0 ; i < tamanio; i++) {
Contacto* contacto = &contactos[i];
if (&contacto != NULL) {
int tel = contacto->getTelefono();
if (tel == telefono) {
return contacto;
}
}
}
return NULL;
}
bool Agenda::modificarPorNombre(string nombre, int nuevoTelefono) {
for (int i = 0 ; i < indice; i++) {
Contacto* contacto = &contactos[i];
if (&contacto != NULL) {
string nom = contacto->getNombre();
if (nom == nombre) {
contacto->setTelefono(nuevoTelefono);
return true;
}
}
}
return false;
}
main.cpp:
Código C++:
Ver original#include <cstdlib>
#include "Contacto.h"
#include "Agenda.h"
#include "Mensajes.h"
using namespace std;
/**
* Código de: http://users.dsic.upv.es/~mpastorg/prg-teleco/cursosPasados/2013-14/tema7/EjercicioAgenda_solucion.pdf
*
* 2. Haz una clase llamada Agenda para manejar una agenda de teléfonos. Los
* objetos instanciados a partir de esa clase tendrán la siguientes funcionalidades:
- Construir una agenda a partir de un número máximo de contactos
posibles (constructor)
- Añadir un contacto nuevo
- Listar todos los contactos de la agenda
- Buscar un contacto por nombre
- Buscar un contacto a partir de un número de teléfono
- Borrar un teléfono dado un nombre
- Modificar un número de telefono dado un nombre
- Puedes añadir más métodos si lo consideras adecuado.
- Las entradas de la agenda se modelarán mediante objetos de la clase
Contacto que habrá que crear.
* Para cada Contacto de la agenda se almacenará la siguiente información:
- Nombre
- Dirección
- Código Postal
- Teléfono
*/
void addContacto(Agenda *);
void buscarXNombre(Agenda *);
void buscarXTelefono(Agenda *);
void borrarXNombre(Agenda *);
void modificarXNombre(Agenda *);
/*--------------------*/
int main(int argc, char** argv) {
int opcion = -1;
Agenda *agenda = NULL;
while(opcion != 0) {
opcion = Mensajes::requestInt(
"* Ingrese opción:"
+ std::string("\n1.Crear una agenda nueva")
+ std::string("\n2.Añadir contacto")
+ std::string("\n3.Listar agenda")
+ std::string("\n4.Buscar un contacto por nombre")
+ std::string("\n5.Buscar un contacto por telefono")
+ std::string("\n6.Borrar un contacto por nombre")
+ std::string("\n7.Modificar un telefono por nombre")
+ std::string("\n0.Salir"));
switch(opcion) {
case 1: {
int tamanio = Mensajes::requestInt("¿tamaño de la agenda?");
agenda = new Agenda(tamanio);
break;
}
case 2: {
addContacto(agenda);
break;
}
case 3: {
Mensajes::messageInfo("\nCONTACTOS:\n" + agenda->toString());
break;
}
case 4: {
buscarXNombre(agenda);
break;
}
case 5: {
buscarXTelefono(agenda);
break;
}
case 6: {
borrarXNombre(agenda);
break;
}
case 7: {
modificarXNombre(agenda);
break;
}
case 0: {
Mensajes::messageInfo("\nGracias por usar este sistema :)\n");
break;
}
default: {
Mensajes::messageInfo("ERROR! Opción equivocada");
break;
}
}
}
return 0;
}
void addContacto(Agenda *xagenda){
string nombre = Mensajes::requestString("Ingrese nombre: ");
string direccion = Mensajes::requestString("Ingrese dirección: ");
int codpos = Mensajes::requestInt("Ingrese código postal: ");
int telefono = Mensajes::requestInt("Ingrese telefono: ");
Contacto* c = new Contacto(nombre, direccion, codpos, telefono);
xagenda->anyadirContacto(c);
}
void buscarXNombre(Agenda *xagenda){
string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
Contacto *c = xagenda->buscarPorNombre(nombre);
if(c != NULL){
Mensajes::messageInfo("\nCONTACTO:\n" + c->toString());
} else {
Mensajes::messageInfo("\n---El contacto no existe---\n");
}
}
void buscarXTelefono(Agenda *xagenda){
int telefono = Mensajes::requestInt("Ingrese telefono para la búsqueda: ");
Contacto *c = xagenda->buscarPorTelefono(telefono);
if(c != NULL){
Mensajes::messageInfo("\nCONTACTO:\n" + c->toString());
} else {
Mensajes::messageInfo("\n---El contacto no existe---\n");
}
}
void borrarXNombre(Agenda *xagenda){
string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
if(xagenda->borrarPorNombre(nombre)){
Mensajes::messageInfo("\n---" +nombre + " fue eliminado :(---\n");
} else {
Mensajes::messageInfo("\n---El contacto no existe---\n");
}
}
void modificarXNombre(Agenda *xagenda){
string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
int telefono = Mensajes::requestInt("Editar telefono: ");
xagenda->modificarPorNombre(nombre, telefono);
}
Ahora tengo la siguiente pregunta y es: ¿cómo puedo implementar el begin y end para hacer un foreach con el array? intenté con varios sitios en internet y nunca pude salir de este error:
Cita: error 'begin' was not declared in this scope
error 'end' was not declared in this scope
Espero sus respuestas y saludos.