Inicializar matriz de objetos em C++
-
Use o
new
operador para inicializar matriz de objetos com construtores parametrizados em C++ -
Use a função
std::vector::push_back
para inicializar o array de objetos com construtores parametrizados -
Use a função
std::vector::emplace_back
para inicializar o array de objetos com construtores parametrizados
Este artigo demonstrará vários métodos sobre como inicializar um array de objetos com construtores parametrizados em C++.
Use o new
operador para inicializar matriz de objetos com construtores parametrizados em C++
O operador new
faz parte da interface de gerenciamento de memória dinâmica C++ e é equivalente à função malloc
da linguagem C. Observe que o gerenciamento de memória dinâmica envolve o fluxo no qual o usuário aloca a memória de um tamanho fixo especificado e a retorna ao sistema quando não for mais necessária.
new
é usado para solicitar o número fixo de bytes do sistema, que retorna o ponteiro para a região da memória se a chamada for bem-sucedida. No exemplo a seguir, definimos uma classe chamada Pair
com dois construtores e printPair
para enviar os membros de dados para o console. Primeiramente, precisamos alocar um array de quatro membros de Pairs
usando o operador new
. Em seguida, podemos percorrer o array com o loop for
e cada iteração inicializar o elemento com o construtor parametrizado. Lembre-se, porém, de que o array alocado deve ser liberado antes da saída do programa usando o operador delete
. Observe também que a notação delete []
é necessária para desalocar cada elemento do array.
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Pair {
int x, y;
public:
Pair() = default;
Pair(int a, int b) : x(a), y(b) {}
void printPair() const { cout << "x: " << x << endl << "y: " << y << endl; }
};
int main() {
Pair *arr = new Pair[4];
for (int i = 0; i < 4; ++i) {
arr[i] = Pair(i * 2, i * i);
}
for (int i = 0; i < 4; ++i) {
arr[i].printPair();
}
delete[] arr;
return EXIT_SUCCESS;
}
Resultado:
x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9
Use a função std::vector::push_back
para inicializar o array de objetos com construtores parametrizados
Alternativamente, uma abordagem mais sem cabeça seria armazenar os objetos no contêiner std::vector
, que forneceria a função embutida para inicializar novos elementos dinamicamente. Ou seja, a definição de Pair
permanece a mesma, mas a cada iteração, chamaremos a função push_back
e passaremos o valor Pair
do segundo construtor. No lado positivo, não precisamos nos preocupar com a desalocação dos recursos de memória; eles são limpos automaticamente.
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Pair {
int x, y;
public:
Pair() = default;
Pair(int a, int b) : x(a), y(b) {}
void printPair() const { cout << "x: " << x << endl << "y: " << y << endl; }
};
int main() {
vector<Pair> array;
for (int i = 0; i < 4; ++i) {
array.push_back(Pair(i * 2, i * i));
}
for (const auto &item : array) {
item.printPair();
}
return EXIT_SUCCESS;
}
Resultado:
x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9
Use a função std::vector::emplace_back
para inicializar o array de objetos com construtores parametrizados
Outro método para inicializar um array de objetos com construtores parametrizados é utilizar a função emplace_back
da classe std::vector
. Desta forma, precisamos apenas passar os valores do construtor Pair
, e emplace_back
construirá automaticamente um novo elemento para nós. Como o método anterior, este também não precisa que o usuário se preocupe com o gerenciamento de memória.
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Pair {
int x, y;
public:
Pair() = default;
Pair(int a, int b) : x(a), y(b) {}
void printPair() const { cout << "x: " << x << endl << "y: " << y << endl; }
};
int main() {
vector<Pair> array;
for (int i = 0; i < 4; ++i) {
array.emplace_back(i * 2, i * i);
}
for (const auto &item : array) {
item.printPair();
}
return EXIT_SUCCESS;
}
Resultado:
x: 0
y: 0
x: 2
y: 1
x: 4
y: 4
x: 6
y: 9
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook