Accedi alle funzioni dei membri dal puntatore a un vettore in C++

Jinku Hu 12 ottobre 2023
  1. Usa la notazione -> per accedere alle funzioni dei membri dal puntatore a un vettore
  2. Usa la notazione (*)vector.member per accedere alle funzioni dei membri dal puntatore a un vettore
Accedi alle funzioni dei membri dal puntatore a un vettore in C++

Questo articolo spiegherà diversi metodi su come accedere alle funzioni membro da un puntatore a un vettore in C++.

Usa la notazione -> per accedere alle funzioni dei membri dal puntatore a un vettore

Le funzioni membro vector possono essere chiamate dal puntatore al vettore con l’operatore ->. In questo caso, stiamo passando il puntatore al vettore a una funzione diversa. Come funzioni membro, è necessario accedere a qualsiasi membro dati della struct /class usando la notazione ->. Notare che, quando si passa il puntatore all’oggetto alla diversa funzione, l’indirizzo dell’operatore (->) deve essere utilizzato prima della variabile.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> *vec) {
  for (auto i = 0; i < vec->size(); ++i) {
    cout << vec->at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<string> str_vec = {"bit",    "nibble",     "byte",      "char",
                            "int",    "long",       "long long", "float",
                            "double", "long double"};

  printVectorElements(&str_vec);

  return EXIT_SUCCESS;
}

Produzione:

bit; nibble; byte; char; int; long; long long; float; double; long double;

Usa la notazione (*)vector.member per accedere alle funzioni dei membri dal puntatore a un vettore

L’accesso al valore puntato dal puntatore avviene tramite un’operazione di dereferenziazione, che può sostituire funzionalmente l’operatore -> e migliorare la leggibilità. L’espressione (*vec).at(i) può essenzialmente eseguire la stessa operazione di accesso ai membri. Nota che stiamo usando il modello di funzione che può stampare un vettore con elementi di tipo generico.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> *vec) {
  for (auto i = 0; i < (*vec).size(); ++i) {
    cout << (*vec).at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<string> str_vec = {"bit",    "nibble",     "byte",      "char",
                            "int",    "long",       "long long", "float",
                            "double", "long double"};

  printVectorElements(&str_vec);

  return EXIT_SUCCESS;
}

Produzione:

bit; nibble; byte; char; int; long; long long; float; double; long double;

In alternativa, supponiamo che il puntatore al vettore sia allocato usando la chiamata di funzione new, e la variabile non sia passata alla funzione diversa. In tal caso, possiamo scegliere una qualsiasi delle notazioni precedenti. Nell’esempio seguente, dimostriamo l’iterazione dell’elemento vettoriale e l’operazione di output utilizzando l’operatore ->.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> *vec) {
  for (auto i = 0; i < vec->size(); ++i) {
    cout << vec->at(i) << "; ";
  }
  cout << endl;
}

int main() {
  auto *i_vec = new vector<int>(10);
  printVectorElements(i_vec);
  for (int i = 0; i < 10; ++i) {
    i_vec->at(i) = i + 1;
    cout << i_vec->at(i) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Uscita (se l’ingresso è +):

0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
1; 2; 3; 4; 5; 6; 7; 8; 9; 10;
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Articolo correlato - C++ Function

Articolo correlato - C++ Pointer

Articolo correlato - C++ Vector