981
C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más / Re:C++ --> Modificar operador <<
« en: 22 de Septiembre 2015, 11:05 »
Buaahh!!!... Apenas acabo de publicar mi duda, ya he hallado solución..
En la función donde modifico el operador, lo que hago es pasar np a una variable temporal de tipo Name_Pairs y ahora ya si me permite acceder a las funciones definidas en la clase.
Para acceder a los vectores nombre y edad, lo hago a través de dos nuevas funciones: get_names() y get_ages() que antes no tenía, pero que ahora ya si he puesto en public:
Y con todo esto, ya no necesito la fucnión print() para mostrar el contenido de los vectores, ahora lo hace el operador << el solito.
Nome cabe duda de que aquí alguien me podría haber ayudado, si le hubiera dado tiempo je je... es curioso que me atasqué cone sto hace un apr de días.. y cuando por fin me decido a pedir ayuda... a los cinco minutos se me enciende la bombilla con la solución.
Gracias igualmente a todo el mundo por hacer posible este foro.
Os dejo como queda el código final:
En la función donde modifico el operador, lo que hago es pasar np a una variable temporal de tipo Name_Pairs y ahora ya si me permite acceder a las funciones definidas en la clase.
Citar
void operator<<(ostream& os, const Name_pairs& np)Además he corregido la definición de esta función indicando que es de tipo void ya que no va a devolver ningún valor.
{
Name_pairs temp = np;
int t = temp.name_size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << temp.get_names() << " Edad: " << temp.get_ages();
}
}
}
Para acceder a los vectores nombre y edad, lo hago a través de dos nuevas funciones: get_names() y get_ages() que antes no tenía, pero que ahora ya si he puesto en public:
Citar
class Name_pairs
{
public:
void read_names();
void read_ages();
//void print();
void sort();
int name_size();//devuelve el tamaño del vector de nombres
vector <string> get_names() { return name; }
vector <double> get_ages() { return age; }
private:
vector <string> name;
vector <double> age;
};
Y con todo esto, ya no necesito la fucnión print() para mostrar el contenido de los vectores, ahora lo hace el operador << el solito.
Nome cabe duda de que aquí alguien me podría haber ayudado, si le hubiera dado tiempo je je... es curioso que me atasqué cone sto hace un apr de días.. y cuando por fin me decido a pedir ayuda... a los cinco minutos se me enciende la bombilla con la solución.
Gracias igualmente a todo el mundo por hacer posible este foro.
Os dejo como queda el código final:
Código: [Seleccionar]
#include "..\..\..\..\lib\std_lib_facilities.h"
namespace Nombres {
class Name_pairs
{
public:
void read_names();
void read_ages();
void sort();
int name_size();//devuelve el tamaño del vector de nombres
vector <string> get_names() { return name; }
vector <double> get_ages() { return age; }
private:
vector <string> name;
vector <double> age;
};
int Name_pairs::name_size()
{
return name.size();
}
void Name_pairs::read_names()
{
string nombre;
do
{
cout << "\nIntroduza nombre(*=FIN): ";
cin >> nombre;
if (nombre != "*") name.push_back(nombre);
} while (nombre != "*");
}
void Name_pairs::read_ages()
{
int t = name.size();
double edad;
if (t == 0)
{
cout << "\nPrimero hay que introducir nombres...\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nIntroduzca la edad de: " << name[i] << " --> ";
cin >> edad;
age.push_back(edad);
}
}
}
void operator<<(ostream& os, const Name_pairs& np)
{
Name_pairs temp = np;
int t = temp.name_size();
if (t == 0)
{
cout << "\nNo hay datos que mostrar.\n";
}
else
{
for (int i = 0; i < t; i++)
{
cout << "\nNombre: " << temp.get_names()[i] << " Edad: " << temp.get_ages()[i];
}
}
}
void Name_pairs::sort()
{
int t = name.size();
if (t == 0)
{
cout << "\nNo hay datos que ordenar.\n";
}
else
{
vector <string> name_temp;
vector <double> age_temp;
for (int i = 0; i < t; i++)
{
name_temp.push_back(name[i]);
age_temp.push_back(age[i]);
}
std::sort(name.begin(), name.end());
//Busca coincidencias entre los vectores de nombres original y ordenado para "copiar" el mismo orden en el vector de edad.
//Esta funcion podria ser errónea si hubieran nombres repetidos en el vector.
for (int i = 0; i < t; i++)
{
for (int j = 0; j < t; j++)
{
if (name_temp[i] == name[j]) age[j] = age_temp[i];
}
}
}
}
}//namespace Nombres
int main()
{
using namespace Nombres;
cout << system("cls");
Name_pairs listado;
listado.read_names();
listado.read_ages();
cout << listado;
listado.sort();
cout << listado;
cout << endl;
return 0;
}