这可能是一个简单的问题,但我无法找到解决问题的好方法。我使用的API有一个类,其构造函数需要 const double 作为参数,例如:
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]);
我知道这是错误的,因为我无法将双作为 const double 参数传递。我在实例构建方面也有一些不正确的用法,但我找不到一个好的方法来做我想要的。有没有人有任何想法?我非常感谢您的意见。
答案 0 :(得分: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]);
答案 1 :(得分: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
作为参数传递。由于()
未实现for (const auto &value:my_value_vec)
my_class_vec.emplace_back(value);
运算符,因此无法编译。
使用现代C ++初始化样本向量的正确方法:
my_class_vec
这假定emplace_back()
为空。 value
在向量的后端构造一个新值,将double const
传递给构造函数。请注意,这将在范围迭代中使用或不使用\
限定符。