2016-08-12 2 views
1

Это, вероятно, простой вопрос, но я не могу найти хороший способ его решения. Я использую API, который имеет класс, конструктор которого нужно сопз двойной в качестве параметра, например:Построить класс с параметрами 'const' во время выполнения

MyClass(const double value); 

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

Яснее, вот что я сделал:

.h файл

std::vector<MyClass> my_class_vec; 
std::vector<double> my_value_vec 

Во время выполнения, я могу получить значения, чтобы сделать my_value_vec назначен. Я хочу использовать эти значения для построения my_class_vec:

.cpp файл

for(int i = 0; i < my_value_vec.size(); i++) 
    my_class_vec(my_value_vec[i]); 

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

+0

«* потому что я не могу передать double как параметр const double. *« ... почему бы и нет? Скорее, более того, это не имеет никакого отношения к тому, почему ваш код не компилируется. –

+0

Спасибо @Nicol Bolas! – Willie

ответ

0

Это неправильно, но для совершенно другая причина. Для начала, но вы, безусловно, можете передать double как const double parameter.

void foo(const double b) 
{ 
} 

double c; 

void bar() 
{ 
    foo(c); 
} 

Это будет компилироваться без каких-либо проблем. Единственное, что const указывает, в этом случае, заключается в том, что функция, foo(), не может изменить свой параметр. Вот и все. Не имеет значения, независимо от того, является ли переданное значение постоянным или изменчивым. Вызывающий абонент может передать либо double, либо const double в качестве параметра. Этот параметр передается по значению. Это означает, что копия параметра производится в каждом случае для вызываемой функции. Копия может быть получена от double или const double, это не имеет значения.

Ваша проблема совершенно иная. Попытка построить вектор в корне неверна. Все неправильно.

std::vector<MyClass> my_class_vec; 
std::vector<double> my_value_vec; 

my_class_vec - это вектор.

my_class_vec(my_value_vec[i]); 

Это не будет компилироваться по той простой причине, что std::vector не реализует operator(), который в настоящее время вызывается здесь. my_class_vec(something) ничего не добавляет к вектору. Нет такого понятия. Это ничего не создает. Это пытается вызвать operator(), передавая double в качестве параметра на объект. Поскольку std::vector не реализует оператор (), это не скомпилируется.

Правильный способ инициализации вектора образца, используя современные C++:

for (const auto &value:my_value_vec) 
    my_class_vec.emplace_back(value); 

Это предполагает, что my_class_vec пуст. emplace_back() создает новое значение на заднем конце вектора, передавая конструктору двойное value. Обратите внимание, что это будет работать с или без квалификатора const в итерации диапазона.

+0

Спасибо @Sam Varshavchik, теперь я знаю, что неправильно использую вектор класса. Но мой компилятор показывает, что std :: vector не имеет имени с именем «emplace_back». Мне что-то не хватает? – Willie

+0

Проблема решена после того, как я использую C++ 11 для компиляции, еще раз спасибо! – Willie

0

потому что я не могу передать double как параметр const double.

Вы можете, конечно, не иметь ничего общего с этим.

Проблема о my_class_vec(my_value_vec[i]);, если вы хотите, чтобы добавить элемент в my_class_vec в соответствии со значением my_value_vec[i], вы можете использовать std::vector::emplace_back (с C++ 11):

my_class_vec.emplace_back(my_value_vec[i]); 
+0

Спасибо @songyuanyao, проблема решена! – Willie

Смежные вопросы