Jump to content
  • Buscar en
    • Más opciones...
    Encontrar resultados que contengan...
    Encontrar resultados en...
Hinoishi314

¿Consulta de C++? uwu

Publicaciones recomendadas

Hinoishi314 Antediluvian

Publicado
vida restante: 100%

Buenas noches, ni si quiera sé si estoy en el subforo correcto porque no suelo pasarme muy a menudo... pero bueno por intentarlo no pierdo nada  X-D  X-D  X-D  no me lo cerréis por diosito.


 


 


Tengo un problema muy absurdo con un código muy sencillo, básicamente tengo que leer datos de un fichero de texto (son 100 o 150 filas, con 3 columnas cada una) para luego operar y jugar con ellos. Como cada fila representa información de una unidad igual a la anterior (por ejemplo medidas de 100 tornillos), he creado una clase en la que defino esas 3 magnitudes que hay en cada columna, y luego voy leyendo el fichero almacenando cada clase como una unidad en un vector de clases. 


 


Si le pido al programa que me muestre el vector número X, efectivamente me muestra los tres valores que hay en la fila X del archivo, pero cuando quiero que me muestre solo una de las columnas del vector número X me dice que la clase no contiene un miembro con ese nombre.


 


Estoy muy frustrado, llevo ya 2 horas con esto y no consigo ver qué pasa, seguro que es una chorrada y eso me hace sentir aún más idiota.


 


 


 


Os copypasteo el código y el error que me sale, si alguien puede ayudarme lo agradezco infinito.


 


 


#include <iostream>

#include <vector>

#include<fstream>

#include <cstdlib>

#include<cmath>

#include <time.h>

 

using namespace std;

 


class Tornillo

{

    int Nserie;

    double diametro;

    double longitud;

 

public:

    Tornillo(int serie=0,double diam=0,double longi=0)

    {

        Nserie=serie;

        diametro=diam;

        longitud=longi;

    }

 

    friend void leeFichero(vector<Tornillo> &v);

    friend ostream& operator<<(ostream &out,Tornillo &v);

    friend void minimo_y_maximo (double &maximo,double &minimo,vector<Tornillo> &v);

    friend void media_y_mediana (double &media,double &mediana,vector<Tornillo> &v);

};

 


void leeFichero(vector<Tornillo> &v)

{

    Tornillo S;

    ifstream fichero("tornillos.txt");

    if(!fichero)

    {

 

        cout<<"El fichero no puede abrirse\n";

        exit(EXIT_FAILURE);

    }

 

    while(fichero)

    {

        fichero>>S.Nserie;

        fichero >>S.diametro;

        fichero>>S.longitud;

        if(!fichero.fail())

            v.push_back(S);

    }

 

    fichero.close();

}

 

ostream& operator<<(ostream &out,Tornillo &v)

{

    out<<v.Nserie<<" "<<v.diametro<<" "<<v.longitud<<endl;

    return out;

}

 


int main()

{

 

    vector<Tornillo> S;

    leeFichero(S);

    leeTolerancias;

    for (int i=0; i=1; ++i)

    cout<<S.diametro<<endl;

 

 

return 0;

}

 

PD: también he probado haciendo S.diametro[3], y nada, siempre es el mismo error. Que la clase Tornillo no tiene un miembro llamado diámetro... ¿puede ser por haber sobrecargado "<<" y aunque me de problemas para imprimir por pantalla, no me vaya a dar problemas para utilizar la columna de Diametros para operar más adelante? Se me acaba de ocurrir mientras escribía, pero no creo que sea eso porque me dice directamente que no existe Diametro, os enseño el mensaje:

 

error: 'class std::vector<Tornillo>' has no member named "diametro"

 

PD2: me pasa exactamente igual si llamo a S.diam

 

 

Gracias por adelantado :)



Editado por Hinoishi314

                                                                  200_s.gif

 

                                           "Solo hay un verdadero Dios, y todos los hombres conocen su don"

Compartir este mensaje


Enlace al mensaje
Compartir en otros sitios web

albertobat HARENA TIGRIS

Publicado
vida restante: 100%
Incluso aunque estés dentro de la clase, si usas una instancia de Tornillo e intentas acceder a un miembro que no es público no lo va a encontrar. Mira a ver si es eso. Esa clase tornillo debe tener acceso a diametro bien mediante la implementación de un get o un set o bien haciendo pública la propiedad. Mira a ver si es eso ( ya no recuerdo si en C++ las clases y propiedades son por defecto privadas y hay que especificar su acceso público, creo que si pero hace cosa de 5años que no programo nada en ese lenguaje.
Like Like

CPU: AMD Ryzen 3700X  GPU: Gigabyte Gtx 1080Ti Aorus  RAM: 32GB DDR4 Corsair Vengeance LPX 3200Mhz C16 Placa Base: x570 Aorus Elite  Cooler: Noctua NH-U12SE  PSU: Thermaltake Thoughpower 750W Grand RGB  SSD1: Sandisk Ultra 3D 250GB (SO)  SSD2: SSD Samsung EVO 850 500GB (Game) HDD: Seagate Barracuda 2TB (Data) Monitor: LG GL850 27’ (1440p-nanoips-144hz-freesync)

 

Compartir este mensaje


Enlace al mensaje
Compartir en otros sitios web

Hinoishi314 Antediluvian

Publicado
vida restante: 100%

Incluso aunque estés dentro de la clase, si usas una instancia de Tornillo e intentas acceder a un miembro que no es público no lo va a encontrar. Mira a ver si es eso. Esa clase tornillo debe tener acceso a diametro bien mediante la implementación de un get o un set o bien haciendo pública la propiedad. Mira a ver si es eso ( ya no recuerdo si en C++ las clases y propiedades son por defecto privadas y hay que especificar su acceso público, creo que si pero hace cosa de 5años que no programo nada en ese lenguaje.

 

Gracias amigo, pero si tengo declarados como públicos los miembros de la clase... :(


                                                                  200_s.gif

 

                                           "Solo hay un verdadero Dios, y todos los hombres conocen su don"

Compartir este mensaje


Enlace al mensaje
Compartir en otros sitios web

albertobat HARENA TIGRIS

Publicado
vida restante: 100%

Gracias amigo, pero si tengo declarados como públicos los miembros de la clase... :-(

oK, al no ver el archivo de cabecera supuse que podría ir por ahí el problema. La sobrecarga del operador no deberia afectar al acceso al metodo, es el típico error de acceso que suele salir por no tener bien la predirectiva de acceso (que no sea pública la propiedad), no enganchar bien el .hpp o algo de ese palo.

Like Like

CPU: AMD Ryzen 3700X  GPU: Gigabyte Gtx 1080Ti Aorus  RAM: 32GB DDR4 Corsair Vengeance LPX 3200Mhz C16 Placa Base: x570 Aorus Elite  Cooler: Noctua NH-U12SE  PSU: Thermaltake Thoughpower 750W Grand RGB  SSD1: Sandisk Ultra 3D 250GB (SO)  SSD2: SSD Samsung EVO 850 500GB (Game) HDD: Seagate Barracuda 2TB (Data) Monitor: LG GL850 27’ (1440p-nanoips-144hz-freesync)

 

Compartir este mensaje


Enlace al mensaje
Compartir en otros sitios web

Dosflores Tatsumaki

Publicado
vida restante: 100%

El error te está diciendo: La clase vector de Tornillos no tiene ningún miembro llamado "diametro". La clase que tiene ese miembro es la clase Tornillo.


 


Vamos, que si haces "S.diametro" estás intentando acceder al diámetro de un vector, que no existe. Y si haces "S.diametro[3]" estás intentando acceder al cuarto elemento del diámetro de un vector. Un diámetro no tiene ningún cuarto elemento (porque no es un vector), pero el compilador ni se da cuenta de ese error, porque antes está el error de que sigues intentando acceder al diámetro de un vector.


 


Estabas cerca de la solución: "S[3].diametro". Así accedes al diámetro del cuarto elemento de un vector.


 


Normalmente no puedes dar por sentado que un vector vaya a tener cuatro o más elementos, así que la forma segura de recorrerlo sería:



for (int i = 0; i < S.size; ++i)
cout << S[i].diametro << endl;

Compartir este mensaje


Enlace al mensaje
Compartir en otros sitios web

albertobat HARENA TIGRIS

Publicado
vida restante: 100%

 

El error te está diciendo: La clase vector de Tornillos no tiene ningún miembro llamado "diametro". La clase que tiene ese miembro es la clase Tornillo.

 

Vamos, que si haces "S.diametro" estás intentando acceder al diámetro de un vector, que no existe. Y si haces "S.diametro[3]" estás intentando acceder al cuarto elemento del diámetro de un vector. Un diámetro no tiene ningún cuarto elemento (porque no es un vector), pero el compilador ni se da cuenta de ese error, porque antes está el error de que sigues intentando acceder al diámetro de un vector.

 

Estabas cerca de la solución: "S[3].diametro". Así accedes al diámetro del cuarto elemento de un vector.

 

Normalmente no puedes dar por sentado que un vector vaya a tener cuatro o más elementos, así que la forma segura de recorrerlo sería:

for (int i = 0; i

cout

Cierto, dí por sentado que la clase leeFichero devolvía un tornillo por cada iteración y estaba tirando de él. Cosas de leer del móvil y no ver la clase, el método y el main de golpe. La cosa era tan sencilla como esa.


CPU: AMD Ryzen 3700X  GPU: Gigabyte Gtx 1080Ti Aorus  RAM: 32GB DDR4 Corsair Vengeance LPX 3200Mhz C16 Placa Base: x570 Aorus Elite  Cooler: Noctua NH-U12SE  PSU: Thermaltake Thoughpower 750W Grand RGB  SSD1: Sandisk Ultra 3D 250GB (SO)  SSD2: SSD Samsung EVO 850 500GB (Game) HDD: Seagate Barracuda 2TB (Data) Monitor: LG GL850 27’ (1440p-nanoips-144hz-freesync)

 

Compartir este mensaje


Enlace al mensaje
Compartir en otros sitios web

Crear una cuenta o conéctate para comentar

Tienes que ser miembro para dejar un comentario

Crear una cuenta

Regístrese para obtener una cuenta nueva en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectar

¿Ya tienes una cuenta? Conéctate aquí.

Conectar ahora

  • Explorando recientemente

    No hay usuarios registrados viendo esta página.

  • Crear nuevo...