在运行时使用 'const' 参数构造 class

Construct class with 'const' parameters during runtime

这可能是一个简单的问题,但我找不到解决它的好方法。我正在使用一个 API,它有一个 class,它的构造函数需要 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]);

我知道这是错误的,因为我不能将 double 作为 const double 参数传递。而且我在实例构造上也有一些不正确的用法,但我找不到一个好的方法来做我想做的事。有人有什么想法吗?非常感谢您的意见。

because I can't pass double as a const double parameter.

当然可以,问题与此无关

问题是关于my_class_vec(my_value_vec[i]);,如果你想根据my_value_vec[i]的值向my_class_vec添加元素,你可以使用std::vector::emplace_back(因为C+ +11):

my_class_vec.emplace_back(my_value_vec[i]);

这是错误的,但原因完全不同。对于初学者,但您当然可以将 double 作为 const double parameter.

传递
void foo(const double b)
{
}

double c;

void bar()
{
  foo(c);
}

这将毫无问题地编译。 const 指定的唯一内容, 在这种情况下 ,是函数 foo() 无法修改其参数.而已。它与传递的值是常量还是可变的无关。调用者可以自由传递 doubleconst double 作为参数。此参数按值传递。这意味着在任何情况下,都会为被调用的函数制作参数的副本。副本可以来自 double,也可以来自 const double,没有区别。

你的问题完全不同。构建向量的尝试从根本上是错误的。1全错了。

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 限定符。