Экземпляр вектора C ++ работает, когда функция возвращает его - PullRequest
0 голосов
/ 03 сентября 2018

В моем классе у меня есть два векторных объекта:

std::vector<std::string> vecteur_noms_A_;
std::vector<std::string> vecteur_noms_B_;

У меня также есть следующая функция:

std::vector<std::string> & get_vecteur_noms_A_() {      
 return vecteur_noms_A_;    
}

но у меня не то же самое для B один!

Когда я создаю экземпляр своего класса и выполняю следующие инструкции в своем конструкторе классов; Я могу видеть (через отладку или когда он выдает ошибку), что:

vecteur_noms_A_.push_back("some value"); // is ok

vecteur_noms_B_.push_back("some other value"); // is not ok <- throws an error.

Отладка позволяет мне видеть, что объект (или экземпляр?) (Пустой вектор) существует для vecteur_noms_A_, но не для vecteur_noms_B_.

Непонятно, почему я наблюдаю тот компромисс, которого я не ожидал, я был бы счастлив, если бы получил объяснение.

Вызывает ли тот факт, что я определяю функцию, компилятор для создания экземпляра объекта?

Вот пример:

#include <iostream>
#include <vector>

using namespace std;
class GP 
{
public:
    //Constructeur
    GP(std::vector<std::string> list_names_A, std::vector<std::string> list_names_B
);

    //Fonctions
    void construction_vecteur_A_B_(std::vector<std::string> list_names_A, std::vector<std::string> list_names_B);


    std::vector<std::string>& get_vecteur_noms_A() {
        return vecteur_noms_A_;
    }

    std::vector<std::string> vecteur_noms_A_;
    std::vector<std::string> vecteur_noms_B_;
};



GP::GP(std::vector<std::string> list_names_a, std::vector<std::string> list_names_b)  {

construction_vecteur_A_B_(list_names_a, list_names_b);

            }


void GP::construction_vecteur_A_B_(std::vector<std::string> list_names_a,     std::vector<std::string> list_names_b)
{
    for (int i = 0; i < list_names_a.size(); i++) {
        vecteur_noms_A_.push_back(list_names_a[i]);
    }
    for (int i = 0; i < list_names_b.size(); i++) {
        vecteur_noms_B_.push_back(list_names_b[i]);
    }
}    


int main()
{

    std::vector<std::string> list_names_A = std::vector<std::string>();
    std::vector<std::string> list_names_B = std::vector<std::string>();
    list_names_A.push_back("A");
    list_names_B.push_back("B");

GP(list_names_A, list_names_B);

    return 0;
}

Поскольку программа, написанная здесь, не выдает ошибку, я хотел бы понять, почему:

vecteur_noms_A_

и

vecteur_noms_B_

существуют при исполнении, так что я могу сделать откат. Почему нет необходимости применять это к ним в конструкторе:

vecteur_noms_A_  = std::vector<std::string>();
vecteur_noms_B_  = std::vector<std::string>();

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 03 сентября 2018

Относительно вашего последнего вопроса. Нет необходимости присваивать значение, такое как std::vector<std::string>(), векторам-членам vecteur_noms_A_, vecteur_noms_B_, поскольку они создаются по умолчанию, когда используется ваш класс GP, до выполнения тела конструктора. .

Обратите внимание, что если вы должны были сделать следующее в теле конструктора GP:

vecteur_noms_A_  = std::vector<std::string>();
vecteur_noms_B_  = std::vector<std::string>();

Это будет эквивалентно следующей операции:

vecteur_noms_A_.operator=(std::vector<std::string>());
vecteur_noms_B_.operator=(std::vector<std::string>());

То есть вы назначаете пустой вектор (используя оператор присваивания копии) уже созданному по умолчанию пустому вектору, который является избыточным.

...