【问题标题】:C++ Initialising Object In Class With Variable In TemplateC++ 使用模板中的变量在类中初始化对象
【发布时间】:2014-07-07 10:26:15
【问题描述】:

我正在尝试使用以下代码初始化 dMatrix

class BpmSolve
{
private:
    const int numZPts;
    Eigen::Matrix<float, 1, numZPts> dMatrix;

public:
    BpmSolve(numberZPoints);
};

BpmSolve::BpmSolve(int numberZPoints)
    : numZPts(numberZPoints),
{
}

代码错误,因为numZPts 是一个变量。如果我将numZPts 替换为整数,则没有问题。

初始化这个类的正确方法是什么? C++11 选项很好。

谢谢。

【问题讨论】:

  • 你打算如何设置numZPts?它必须是编译时间常数,在这种情况下,BpmSolve 的所有实例都应该相同,这意味着您可以这样做:static const int numZPts = 42;
  • 什么意思?我在初始化课程时设置它。构造函数位于类头下方。我只是打算调用构造函数。
  • 嗯,这不是编译时间常数,所以你不能这样做。
  • 是的,在编译时该值是未知的。它将根据用户输入而改变。这是一项要求。
  • 查看 Eigen 文档,似乎有一个具有运行时维度的 Matrix 变体;这可能就是您所需要的(参见eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html)。

标签: c++ class templates c++11


【解决方案1】:

Eigen::Matrix 是一个模板,模板参数必须在编译时可用。 numZPts 的值在编译时不可用 - 每次构造 BpmSolve 对象时,该字段的值可能不同,并且该值在编译时未知。所以你要求的东西是不可能的。

【讨论】:

  • 好的,谢谢。我想我必须使用动态矩阵并在构造函数中设置它的维度。我不知道模板是在编译时评估的
  • @Jean-Luc 或将您的 BpmSolve 类设为以 int numZPts 为参数的模板。
【解决方案2】:

numZPts 值未在编译时定义。如果该类的所有实例碰巧在整个代码中使用该值的常量,您可以简单地将您的类转换为由它参数化的模板:

template <int numZPts>
class BpmSolve {
private:
    Eigen::Matrix<float, 1, numZPts> dMatrix;
    // [...]

BpmSolve::BpmSolve(){
}

实例变为:

BpmSolve<init> instance;

代替

BpmSolve instance(init);

如果这个类有继承的孩子,这可能会触发进一步的变化。

【讨论】:

  • 不幸的是,numZPts 在编译时是未知的。程序将读取任意文件,并据此计算numZPts。我认为这意味着我不能这样做。
  • 嗯,值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
相关资源
最近更新 更多