Std :: vector не изменяет данные внутри класса - PullRequest
0 голосов
/ 23 декабря 2018

Я делаю кое-что с векторами и пытаюсь написать программу, которая может проходить и выполнять операции с объектами внутри вектора.Я много читал о минимальном коде, поэтому я запрограммировал это маленькое приложение для иллюстрации проблемы.

Вывод этой программы:

Element 1 is equal to 2
Element 2 is equal to 4
Element 1 is equal to 2
Element 2 is equal to 4
Press any key to continue...

Вывод должен быть:

Element 1 is equal to 2
Element 2 is equal to 4
Element 1 is equal to 7
Element 2 is equal to 9
Press any key to continue...

Почему я не достигаю желаемого результата?

#include <vector>
#include <iostream>

// Some object
class A {
public:
    A(int data)
        : data(data)
    {}

    int data;
};

class B {
public:
    // A function that adds a new 'A' object to the vector in class b
    void push_back_to_vector(A &element);
    // A function that changes the data of the objects stored in vector_of_a
    void add_to_vector();
    // A vector to hold objects of A
    std::vector<A> vector_of_a;
};

void B::push_back_to_vector(A &element) {
    vector_of_a.push_back(element);
}

void B::add_to_vector() {
    for (size_t i = 0; i < vector_of_a.size(); i++) {
        // Add five to all the elements in the vector
        vector_of_a[i].data += 5;
    }
}

int main() {
    A element_1(2);
    A element_2(4);

    B b;
    b.push_back_to_vector(element_1);
    b.push_back_to_vector(element_2);

    std::cout << "Element 1 is equal to " << element_1.data << std::endl;
    std::cout << "Element 2 is equal to " << element_2.data << std::endl;

    // This should change element_1.data to 7 and element_2.data to 9
    b.add_to_vector();

    std::cout << "Element 1 is equal to " << element_1.data << std::endl;
    std::cout << "Element 2 is equal to " << element_2.data << std::endl;

    system("pause");
    return 0;
}

1 Ответ

0 голосов
/ 23 декабря 2018

push_back копирует новые элементы.Если вы хотите делать то, что вам, кажется, нужно, вам нужно хранить указатели на A, а не просто A.

По сути, ваш код просто такой:

A element_1(2);
A element_2(4);

std::cout << "Element 1 is equal to " << element_1.data << std::endl;
std::cout << "Element 2 is equal to " << element_2.data << std::endl;

std::cout << "Element 1 is equal to " << element_1.data << std::endl;
std::cout << "Element 2 is equal to " << element_2.data << std::endl;

system("pause");
return 0;

Все что связано с B не работает.Попробуйте это:

class B {
public:
    // A function that adds a new 'A' object to the vector in class b
    void push_back_to_vector(A *element);
    // A function that changes the data of the objects stored in vector_of_a
    void add_to_vector();
    // A vector to hold objects of A
    std::vector<*A> vector_of_a;
};

void B::push_back_to_vector(A* element) {
    vector_of_a.push_back(element);
}

void B::add_to_vector() {
    for (size_t i = 0; i < vector_of_a.size(); i++) {
        // Add five to all the elements in the vector
        vector_of_a[i]->data += 5;
    }
}

И передайте указатели:

b.push_back_to_vector(&element_1);
b.push_back_to_vector(&element_2);

Конечно, помните о времени жизни объектов в стеке, на которые вы указываете в B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...