elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 45
21  Programación / Programación C/C++ / Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea? en: 15 Octubre 2017, 09:24 am
Si que se te está usando. Se usa cuando el número de elementos del vector es mayor que el número de elementos del initializer_list (aclarado con ejemplos y demostrado para mi compilador).
22  Programación / Programación C/C++ / Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea? en: 15 Octubre 2017, 00:46 am
Bueno, tras realizar algunas comprobaciones tecleando código, he llegado a las siguientes conclusiones:

Lo que hace C++11 es decir: vale, te permito crear un arreglo e inicializarlo con una initializer_list con un número de elementos menor o igual al tamaño del arreglo, pero bajo las siguientes condiciones:

  • Si el número de elementos del initializer_list es igual al número de elementos del vector, entonces puedes crearlo sin problemas
  • Si el número de elementos del initializer_list es menor que el número de elementos del vector, te dejo crearlo, pero tienes que definir un constructor que acepte un initializer_list (con cualquier tipo base). Entonces, lo que el compilador hace es lo siguiente (hablo de mi compilador, no sé si será estándar): Tomo los primeros elementos del initializer_list y con ellos construyo los primeros elementos del vector. Con los últimos elementos del vector, llamo al constructor con un initializer_list vacío(si hubiera varios con varios tipos, entonces marcaría error de ambigüedad). Posteriormente pongo un ejemplo
  • Si el número de elementos del initializer_list supera el número de elementos del vector, se marca error


Ejemplo de la segunda condición:

Código
  1. #include <iostream>
  2. #include <initializer_list>
  3.  
  4. class Objeto {
  5. private:
  6.    int u;
  7.  
  8. public:
  9.    Objeto(int n);
  10.    Objeto(const std::initializer_list<char> &n);
  11.  
  12.    void Imprimir();
  13. };
  14.  
  15. int main() {
  16.    Objeto cadenas[3] = {1, 1};
  17.  
  18.    std::cout << std::endl;
  19.  
  20.    for(int i = 0; i < 3; i++)
  21.        cadenas[i].Imprimir();
  22.  
  23.    return 0;
  24. }
  25.  
  26. Objeto::Objeto(int n) {
  27.    std::cout << n << std::endl;
  28.  
  29.    u = 1;
  30. }
  31.  
  32. Objeto::Objeto(const std::initializer_list<char> &n) {
  33.    std::initializer_list<char>::iterator it;
  34.  
  35.    std::cout << "Initializer (size = " << n.size() << "): ";
  36.    for(it = n.begin(); it != n.end(); it++)
  37.        std::cout << *it << ' ';
  38.    std::cout << std::endl;
  39.  
  40.    u = 2;
  41. }
  42.  
  43. void Objeto::Imprimir() {
  44.    std::cout << u << std::endl;
  45. }

La salida del siguiente código:

Citar
1
1
Initializer (size = 0):

1
1
2

Como podéis ver, para los primeros elementos, se llama al constructor de parámetro tipo 'int' (aquí pongo un poco de conversión implícita), y cuando se queda sin elementos, se llama al constructor con el initializer_list con cero valores. Si hubieramos definido otro constructor con initializer_list con tipo, por ejemplo, std::string, hubiera dado error de ambigüedad.

Espero haberme explicado bien. Esta es una particularidad de C++ que desconocía por completo
23  Programación / Programación C/C++ / Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea? en: 15 Octubre 2017, 00:07 am
Esto es raro. Si intento compilar el ejemplo del string:

Código
  1. std::string cadenas[100] = {"Cadena"};

si que funciona, pero si lo hago para un tipo de dato definido por mi:

Código
  1. #include <iostream>
  2.  
  3. class Objeto {
  4. public:
  5.    Objeto(int n);
  6. };
  7.  
  8. int main() {
  9.    Objeto cadenas[100] = {1};
  10.  
  11.    return 0;
  12. }

si que me da error:

Citar
prueba.cpp:9:29: error: no se puede convertir ‘<lista inicializador dentro de llaves>()’ de ‘<lista inicializador dentro de llaves>’ a ‘Objeto’
     Objeto cadenas[100] = {1};
24  Programación / Programación C/C++ / Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea? en: 14 Octubre 2017, 23:51 pm
De acuerdo, usaré los vectores de la STL. Gracias! (una pena que no se pueda)
25  Programación / Programación C/C++ / Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea? en: 14 Octubre 2017, 22:47 pm
No era eso lo que quería decir. A veces me explico muy mal xD. Siguiendo con el ejemplo de string que has propuesto, mi intención es crear un vector de string de la siguiente forma:

Código
  1. std::string cadenas[100] = {"Cadena"};

El resultado esperado por mi sería que cada cadena sea inicializada con "Cadena". Poniendo esa línea, el compilador me tira error.
26  Programación / Programación C/C++ / (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea? en: 14 Octubre 2017, 21:06 pm
Hola, muy buenas.

Mi duda es la siguiente: imaginemos que tenemos una clase con un solo constructor, que necesita parámetros. ¿Podríamos crear e instanciar un arreglo de objetos tipo <esa clase> con algo parecido a la siguiente sintaxis?

Código
  1. Objeto objetos[NUM_OBJETOS] = {0};

En este caso, el constructor del objeto recibiría como parámetro un entero, por lo que se haría 'conversión' implícita.

Muchas gracias
27  Programación / Programación C/C++ / Re: (Consulta) Error muy extraño con la salida a consola en C++ en: 10 Octubre 2017, 19:36 pm
Vaaaale. Ya entiendo!!!!!! std::getline no se salta los retornos de carro... Pues no tenía ni idea!!

Muchas gracias por pasaros!
28  Programación / Programación C/C++ / Re: (Consulta) Error muy extraño con la salida a consola en C++ en: 10 Octubre 2017, 19:31 pm
Mira que imprimí los caracteres por si había alguno raro... No me fijé en el carriage character. Es muy raro, los datos se han leído usando la clase std::ifstream, ¿no debería saltarse estos caracteres cuando se lee sin activar la lectura binaria?

Muchas gracias
29  Programación / Programación C/C++ / (Consulta) Error muy extraño con la salida a consola en C++ en: 10 Octubre 2017, 18:29 pm
Hola, muy buenas. Estoy desarrollando para la facultad una clase llamada Cronologia y otra como FechaHistorica, y tengo problemas con la salida del FechaHistorica. En esta clase, he definido una sobrecarga de operador amigo así:

Código
  1. std::ostream& operator<<(std::ostream &os, const FechaHistorica &fecha) {
  2.    // PRUEBAS
  3.    for(int i = 0; i < (int)fecha.acontecimientos.size(); i++)
  4.        os << fecha.acontecimientos[i] << std::endl;
  5.  
  6.    os << "________________________________" << std::endl;
  7.  
  8.    for(int i = 0; i < (int)fecha.acontecimientos.size(); i++) {
  9.        for(int j = 0; j < (int)fecha.acontecimientos[i].size(); j++)
  10.            os << '(' <<(int)fecha.acontecimientos[i][j] << ',' << fecha.acontecimientos[i][j] << ") ";
  11.  
  12.        os << std::endl << "___" << std::endl;
  13.    }
  14.  
  15.    // CÓDIGO REAL
  16.    os << fecha.año;
  17.  
  18.    for(const std::string &elemento : fecha.acontecimientos)
  19.        os << FechaHistorica::TERMINADOR << elemento;
  20.  
  21.    return os;
  22. }

La parte etiquetada como 'PRUEBAS' significa que no pertenece al código final. FechaHistorica tiene un año (int) y un conjunto de acontecimientos (std::vector de std::string). Pues bien, cuando yo ejecuto ese operador obtengo la siguiente salida:

Citar
Apriori algorithm developed by Rakesh Agrawal and Ramakrishnan Srikant
Nada en especial
Algo
________________________________
(65,A) (112,p) (114,r) (105,i) (111,o) (114,r) (105,i) (32, ) (97,a) (108,l) (103,g) (111,o) (114,r) (105,i) (116,t) (104,h) (109,m) (32, ) (100,d) (101,e) (118,v) (101,e) (108,l) (111,o) (112,p) (101,e) (100,d) (32, ) (98,b) (121,y) (32, ) (82,R) (97,a) (107,k) (101,e) (115,s) (104,h) (32, ) (65,A) (103,g) (114,r) (97,a) (119,w) (97,a) (108,l) (32, ) (97,a) (110,n) (100,d) (32, ) (82,R) (97,a) (109,m) (97,a) (107,k) (114,r) (105,i) (115,s) (104,)  (110,n) (97,a) (110,n) (32, ) (83,S) (114,r) (105,i) (107,k) (97,a) (110,n) (116,t) (13,
___
(78,N) (97,a) (100,d) (97,a) (32, ) (101,e) (110,n) (32, ) (101,e) (115,s) (112,p) (101,e) (99,c) (105,i) (97,a) (108,l)
___
(65,A) (108,l) (103,g) (111,o)
___
#Nada en especial#Algo developed by Rakesh Agrawal and Ramakrishnan Srikant

Como podeis ver, el vector de string contiene los string
  • Apriori algorithm developed by Rakesh Agrawal and Ramakrishnan Srikant
  • Nada en especial
  • Algo

Después he impreso el valor numérico de cada carácter.

El ERROR está en la siguiente parte:
Citar
#Nada en especial#Algo developed by Rakesh Agrawal and Ramakrishnan Srikant

En el código, tengo que se imprima primero el año, y luego el conjunto de sucesos, pero por alguna razón, parece ser que la posición del cursor (columna) vuelve a 0, y sobreescribe los datos de la línea ya impresos. Espero haberme explicado bien.

He probado en cada iteración a hacer un flush de 'os', pero no ha resultado.

Muchas gracias!
30  Programación / Java / Re: (Consulta) Posible BUG en Java en: 2 Octubre 2017, 14:55 pm
Jaja. Ya sé que el tema de los BUGS es un tema que casi nunca se da, pero como había compilado el JDK no oficial con makepkg, pues pensé en los bugs automáticamente. Tenías razón, no es un BUG, es la representación del booleano. Al final he cambiado la representación en mi archivo. ¡Muchas gracias!
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 45
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines