How can I set class member variable correctly from vector in C++

I’m trying to set a class member variable from STL vector in C++.

But it doesn’t work the way I want it to. The variable doesn’t change, The variable is the same like before.

Am I programming in the wrong way?

Here’s the code.

#include <iostream>
#include <vector>
using namespace std;

class Test {
  std::string name;

  Test(std::string p_name);
  std::string getName();
  void setName(std::string p_name);

Test::Test() { name = ""; }

Test::Test(std::string p_name) : name(p_name) {}

std::string Test::getName() { return name; }

void Test::setName(std::string p_name) { name = p_name; }

int main() {
  // Initializing vector with values
  vector<Test> tests;

  for (size_t i = 0; i < 10; i++) {

  for (Test test : tests) {
    cout << test.getName() << endl;

  for (Test test : tests) {
    cout << test.getName() << endl;

  return 0;

This is the result:

> ./main


Why It doesn’t work, and how to fix it?

>Solution :

You’re copying the elements from the vector each time you iterate through it in your loop.

Try changing your code to something like this:

for (auto& test : myTests) {
    test.setName("My new name");

In this case, the ampersand (&) marks the variables as a reference, which means you can manipulate it directly.

The way your code is written, you’re using the copy-constructor to construce a new object.

You can circumvent this, by adding something like:

    explicit Test(const Test&) = delete;

to your class.
This will prevent the copying of the object, which will reduce the likelihood of these types of errors.

Leave a Reply