Инициализация вектора в конструкторе - C ++

0

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

У меня есть класс "Настройки", который обрабатывает параметр, который я использую для моделирования и класс Simulations, который выполняет шаги моделирования.

Я не понимаю, почему этот код работает не так, как ожидалось:

      class Settings{ 
         public: 
           int n ; // a number I need to create properly a vector in my class simulation
           // ... rest of the code constructors etc to read values from files.
           // everything works fine and the values are assigned properly
       }

       class Simulation{
          public:
          std::vector<int> v ;
          Settings *SP;

          Simulation(Settings *);
        }

        Simulation::Simulation(Settings *pS) 
           :SP(pS), v(std::vector<int>(SP->n,0)) {}    // the constructor doesn't work,
    // v is initialized but it is not created as a vector of size n, but 0.

Я думаю, что есть проблема в том, как я использую конструктор, но я не могу понять, почему.

Кстати, определение v внутри фигурных скобок отлично работает, мне просто интересно узнать, почему определяя его, правильный способ не работает должным образом!

Большое спасибо за помощь!

  • 0
    Короткий, полный, компилируемый пример, демонстрирующий проблему, пожалуйста.
Теги:
vector
constructor

4 ответа

2
Лучший ответ

Вам не нужен дополнительный вектор:

Simulation::Simulation(Settings *pS) 
       :SP(pS), v(SP->n,0) {}

Если это не работает, это не ваш код. Вы уверены, что SP объявлен до v в определении класса? Если это также не работает, попробуйте pS вместо SP.

  • 0
    Вы были правы, ИП не было объявлено до v! Я думал, что заказ, который имел значение, был тем в конструкторе! Спасибо за совет, теперь работает нормально :)
  • 0
    Члены @LucaCerone инициализируются в том порядке, в котором они появляются в определении класса, поэтому правильный размер не был взят;)
Показать ещё 1 комментарий
2

Вы подтвердили, что pS->n != 0 до создания экземпляра Simulation, правильно?

В любом случае, я думаю, что строка, которую вы ищете в своем конструкторе, это:

:SP(pS), v(pS->n, 0) {}

Теперь вы создаете целую std::vector, а затем копируете ее в v.

0

Вам не нужно создавать дополнительный вектор и использовать конструктор копирования. Просто передайте аргументы прямо к вашему вектору в инициализаторе члена. Как упоминалось еще один плакат, вы подтвердили, что возврат SP- > n на самом деле не равен 0? Если вы скопируете некоторые значения, вы увидите, что он работает нормально, как показано ниже:

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

class foo
{
public:
    foo();
    vector<int> vec;
};

int main()
{
    foo obj;
    for(int i=0;i<obj.vec.size();++i) {
        cout << obj.vec[i] << ' ';
    }
    system("pause");
    return 0;
}


foo::foo()
    :vec(vector<int>(10,2))
{

}
0

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

Simulation::Simulation(Settings *pS) 
   :SP(pS), v(pS != NULL ? pS->n : 0 , 0) {}

Это проверит, что SP не будет NULL. это тот случай, когда в качестве конструктора используется симуляция (NULL).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню