Я борюсь с конструктором одного из моих классов, чтобы сделать его членом который не инициализирован должным образом.
У меня есть класс "Настройки", который обрабатывает параметр, который я использую для моделирования и класс 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 внутри фигурных скобок отлично работает, мне просто интересно узнать, почему определяя его, правильный способ не работает должным образом!
Большое спасибо за помощь!
Вам не нужен дополнительный вектор:
Simulation::Simulation(Settings *pS)
:SP(pS), v(SP->n,0) {}
Если это не работает, это не ваш код. Вы уверены, что SP
объявлен до v
в определении класса? Если это также не работает, попробуйте pS
вместо SP
.
Вы подтвердили, что pS->n != 0
до создания экземпляра Simulation
, правильно?
В любом случае, я думаю, что строка, которую вы ищете в своем конструкторе, это:
:SP(pS), v(pS->n, 0) {}
Теперь вы создаете целую std::vector
, а затем копируете ее в v
.
Вам не нужно создавать дополнительный вектор и использовать конструктор копирования. Просто передайте аргументы прямо к вашему вектору в инициализаторе члена. Как упоминалось еще один плакат, вы подтвердили, что возврат 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))
{
}
Также убедитесь, что вы проверяете, что SP не является нулевым указателем. В противном случае это может быть сбой.
Simulation::Simulation(Settings *pS)
:SP(pS), v(pS != NULL ? pS->n : 0 , 0) {}
Это проверит, что SP не будет NULL. это тот случай, когда в качестве конструктора используется симуляция (NULL).