Cómo inicializar una array de objetos con constructores parametrizados en C++

Array de objetos: 
cuando se define una clase, solo se define la especificación del objeto; no se asigna memoria ni almacenamiento. Para usar las funciones de datos y acceso definidas en la clase, debe crear objetos.

Sintaxis: 

ClassName ObjectName[number of objects];

Diferentes métodos para inicializar el Array de objetos con constructores parametrizados : 

       1. Usar un montón de llamadas a funciones como elementos de la array:  es como una declaración de array normal, pero aquí inicializamos la array con llamadas a funciones del constructor como elementos de esa array.

C++

#include <iostream>
using namespace std;
 
class Test {
    // private variables.
private:
    int x, y;
 
public:
    // parameterized constructor
    Test(int cx, int cy)
    {
        x = cx;
        y = cy;
    }
    // method to add two numbers
    void add() { cout << x + y << endl; }
};
int main()
{
    // Initializing 3 array Objects with function calls of
  // parameterized constructor as elements of that array
    Test obj[] = { Test(1, 1), Test(2, 2), Test(3, 3) };
 
    // using add method for each of three elements.
    for (int i = 0; i < 3; i++) {
        obj[i].add();
    }
 
    return 0;
}

       2. Usando malloc() : Para evitar la llamada de un constructor no parametrizado, use el método malloc(). El método «malloc» o «asignación de memoria» en C++ se usa para asignar dinámicamente un solo bloque grande de memoria con el tamaño especificado. Devuelve un puntero de tipo void que se puede convertir en un puntero de cualquier forma.

C++

#include <iostream>
#define N 5
 
using namespace std;
 
class Test {
    // private variables
    int x, y;
 
public:
    // parameterized constructor
    Test(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
 
    // function to print
    void print() { cout << x << " " << y << endl; }
};
 
int main()
{
    // allocating dynamic array
    // of Size N using malloc()
    Test* arr = (Test*)malloc(sizeof(Test) * N);
 
    // calling constructor
    // for each index of array
    for (int i = 0; i < N; i++) {
        arr[i] = Test(i, i + 1);
    }
 
    // printing contents of array
    for (int i = 0; i < N; i++) {
        arr[i].print();
    }
 
    return 0;
}
Producción: 

0 1
1 2
2 3
3 4
4 5

 

       3. Uso de palabra clave nueva : el operador nuevo denota una solicitud de asignación de memoria en el montón. Si hay suficiente memoria disponible, el operador new inicializa la memoria y devuelve la dirección de la memoria recién asignada e inicializada a la variable de puntero. Aquí, pointer-variable es el puntero de tipo data-type. El tipo de datos podría ser cualquier tipo de datos incorporado, incluida la array, o cualquier tipo de datos definido por el usuario, incluidas la estructura y la clase.

Para la inicialización dinámica, la nueva palabra clave requiere un constructor no parametrizado si agregamos un constructor parametrizado. Así que usaremos un constructor ficticio para ello.

C++

#include <iostream>
#define N 5
 
using namespace std;
 
class Test {
    // private variables
    int x, y;
 
public:
    // dummy constructor
    Test() {}
 
    // parameterized constructor
 
    Test(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
 
    // function to print
    void print() { cout << x << " " << y << endl; }
};
 
int main()
{
    // allocating dynamic array
    // of Size N using new keyword
    Test* arr = new Test[N];
 
    // calling constructor
    // for each index of array
    for (int i = 0; i < N; i++) {
        arr[i] = Test(i, i + 1);
    }
 
    // printing contents of array
    for (int i = 0; i < N; i++) {
        arr[i].print();
    }
 
    return 0;
}
Producción: 

0 1
1 2
2 3
3 4
4 5

 

Si no usamos el compilador del constructor ficticio, mostraría el error que se muestra a continuación 

Error del compilador:  

error: no matching function for call to ‘Test::Test()’
     Test *arr=new Test[N];

       4. Uso de puntero doble (concepto de puntero a puntero) : un puntero a un puntero es una forma de múltiples direcciones indirectas, o una string de punteros. Normalmente, un puntero contiene la dirección de una variable. Cuando definimos un puntero a un puntero, el primer puntero contiene la dirección del segundo puntero, que apunta a la ubicación que contiene el valor real, como se muestra a continuación.
Aquí podemos asignar una cantidad de bloques para asignar y, por lo tanto, para cada índice tenemos que llamar al constructor parametrizado usando la nueva palabra clave para inicializar.

C++

#include <iostream>
#define N 5
 
using namespace std;
 
class Test {
    // private variables
    int x, y;
 
public:
    // parameterized constructor
 
    Test(int x, int y)
        : x(x)
        , y(y)
    {
    }
 
    // function to print
    void print() { cout << x << " " << y << endl; }
};
 
int main()
{
    // allocating array using
    // pointer to pointer concept
    Test** arr = new Test*[N];
 
    // calling constructor for each index
    // of array using new keyword
    for (int i = 0; i < N; i++) {
        arr[i] = new Test(i, i + 1);
    }
 
    // printing contents of array
    for (int i = 0; i < N; i++) {
        arr[i]->print();
    }
 
    return 0;
}
Producción: 

0 1
1 2
2 3
3 4
4 5

 

       5. Uso de Vector de clase de tipo: Vector es uno de los elementos más poderosos de la Biblioteca de plantillas estándar que facilita la escritura de códigos complejos relacionados con arrays estáticas o dinámicas de una manera eficiente. Toma un parámetro que puede ser de cualquier tipo y, por lo tanto, usamos nuestra Clase como un tipo de vector y empujamos Objetos en cada iteración del ciclo. 
Los vectores son lo mismo que las arrays dinámicas con la capacidad de cambiar su tamaño automáticamente cuando se inserta o elimina un elemento, y el contenedor maneja automáticamente su almacenamiento. Los elementos vectoriales se colocan en almacenamiento contiguo para que se pueda acceder a ellos y recorrerlos mediante iteradores. En los vectores, los datos se insertan al final. 

C++

#include <iostream>
#include <vector>
#define N 5
 
using namespace std;
 
class Test {
    // private variables
    int x, y;
 
public:
    // parameterized constructor
 
    Test(int x, int y)
        : x(x)
        , y(y)
    {
    }
 
    // function to print
    void print() { cout << x << " " << y << endl; }
};
 
int main()
{
    // vector of type Test class
    vector<Test> v;
 
    // inserting object at the end of vector
    for (int i = 0; i < N; i++)
        v.push_back(Test(i, i + 1));
 
    // printing object content
    for (int i = 0; i < N; i++)
        v[i].print();
 
    return 0;
}
Producción: 

0 1
1 2
2 3
3 4
4 5

 

Publicación traducida automáticamente

Artículo escrito por aankik y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *