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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?  (Leído 4,873 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(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


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #1 en: 14 Octubre 2017, 22:38 pm »

En el array, pones los parámetros para construir los objetos entre llaves:
Código
  1. string strs[] = {{"a", 1}, {"b", 1}, {"c", 1}};


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #2 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.
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #3 en: 14 Octubre 2017, 23:49 pm »

Lo que comentas no es posible.
De todos modos, en C++11 es preferible utilizar clases como vector en vez de arrays de C.
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #4 en: 14 Octubre 2017, 23:51 pm »

De acuerdo, usaré los vectores de la STL. Gracias! (una pena que no se pueda)
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #5 en: 14 Octubre 2017, 23:57 pm »

Claro que puedes crear un array de punteros. Y la linea que muestras esta bien, deberia compilar sin problema. Muestra el error que te da el compilador.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #6 en: 15 Octubre 2017, 00:02 am »

Claro que puedes crear un array de punteros. Y la linea que muestras esta bien, deberia compilar sin problema. Muestra el error que te da el compilador.

Habla de inicializar todos los elementos de un array con un mismo conjunto de parámetros.
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #7 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};
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #8 en: 15 Octubre 2017, 00:36 am »

Para tu objeto definido no funcionaria asi, tendrias que currartelo, por ejemplo, sobrecargando operadores, y claro esta, dentro de la clase tendrias que gestionar los punteros, reservar memoria, etc... pero podrias conseguir algo asi :

Código
  1. //Definir un array o arreglo de 4 elementos
  2. Objeto *varios=new Objeto(1,32,55,6); // con argumentos indefinidos (...)
  3.  
  4. // luego
  5. std:cout << *varios[0].id; // mostraria 1, por ejemplo (sobrecarga los corchetes para acceder al resto de elementos)

o sino quieres complicarte usar un vector como bien dice ivancea96.
« Última modificación: 15 Octubre 2017, 02:38 am por srWhiteSkull » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta/C++11) Es posible inicializar un arreglo de objetos en la misma línea?
« Respuesta #9 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
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo Dinamico con Objetos :S
Java
Xephiro 9 14,107 Último mensaje 6 Marzo 2009, 20:20 pm
por juancho77
Declarar e inicializar matriz de objetos
Java
alzehimer_cerebral 1 5,125 Último mensaje 17 Noviembre 2009, 19:07 pm
por Leyer
Crear un arreglo de objetos con el constructor
Programación C/C++
ThronerAXE 1 1,699 Último mensaje 16 Febrero 2014, 18:38 pm
por eferion
Arreglo de objetos
Java
Aida 7 4,148 Último mensaje 16 Marzo 2014, 23:45 pm
por Mitsu
(Consulta) Inicializar arreglo de estructura en C
Programación C/C++
class_OpenGL 2 1,656 Último mensaje 27 Octubre 2016, 14:37 pm
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines