【问题标题】:How can i extend a class in a library like Armadillo?如何在像犰狳这样的库中扩展一个类?
【发布时间】:2014-01-18 21:02:02
【问题描述】:

我正在为 3D 图形使用 3D 矢量。 我创建了一个类 vec3 来添加 getX、getY、getZ、setX、setY、setZ、setXYZ...等函数。

#include <armadillo>
using namespace arma;

// An extension to VEC class for Armadillo for 3D graphics.
class vec3 : public vec
{
public:

    // Constructor inits vector to 0,0,0
    vec3() : vec(3,fill::zeros) {}
    ~vec3(void){};

    double getX() const { return at(0); }
    double getY() const { return at(1); }
    double getZ() const { return at(2); }

    void   setX(double x){ ?????? = x; }
};

我发现自己迷失在一个从未发现过的非常不寻常的情况中:

我如何在类中使用 (i) 访问元素...?

对于 getter 函数,正如您所见,这很简单,因为我们至少有一个“at”函数。 但是我如何创建一个 setX 函数,将给定元素插入向量的 0 位置......

我试过 this(i) ,显然没有用。我在这里感觉很新手... “vec”在哪里构建?一个std::vector?...我做这些简单的事情做得对吗?

【问题讨论】:

  • 我对基类 (vec) 的了解不够,无法回答您的问题。基类的代码是公开的吗?您至少可以发布公共标头吗?
  • 是的,我考虑过。我想,那么,我应该使用基类......对吗?如果它是一个 std::vector ......那我该怎么办?让我检查一下。
  • 犰狳是哪个图书馆?是this一个吗?
  • @StevenHansen 它是开源的。我打开了重定向到所有文件的包含文件(我没有找到 VEC .. 很遗憾),但我看到它包括:#include 在顶部。我猜它与std有关:那么,如果VEC本身就是一个模板向量,我该怎么做呢?
  • 就我个人而言,我只是将您的课程改为使用作文。它只会在编码过程中引入少量额外的麻烦,但可以完全访问 Armadillo 的 vec 公共接口的所有功能。

标签: c++ extend armadillo


【解决方案1】:

如果 vec 是从 std::vector 派生的,at(0) = x; 应该可以工作,因为 at 函数可以返回非常量引用。

【讨论】:

  • 是的!这行得通。例如,我想知道如果我没有那个功能该怎么办。扩展比包含类的元素更好吗?我想这需要更多的内存。
  • 包含(或组合)是一个非常好的选择,尤其是在您不引入其他数据的情况下。
  • 另一个想法 - 通常依赖第三方提供的特定实现是不明智的。他们可能决定在下一个版本中完全改变内部结构。
  • 好吧,at() 是定义接口的一部分。你应该能够指望这一点。 可能没有定义的是库使用的基类(或任何内部实现)。因此,虽然 VEC 目前可能是 MAT 的子代,而后者又可能是 std::vector 的子代,谁知道在未来的版本中是否会出现这种情况除非它已被指定为API 的一部分。
  • 我怀疑 Armadillo 的 vec 类的实现会改变它的父类。它被明确记录为派生自 mat 类。 mat 类表示一个矩阵,而 vec 类是一个受限矩阵。这在数学上是有意义的,因为向量被定义为具有一行或一列的矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多