如何在像犰狳这样的库中扩展一个类?

Posted

技术标签:

【中文标题】如何在像犰狳这样的库中扩展一个类?【英文标题】: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 公共接口的所有功能。 【参考方案1】:

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

【讨论】:

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

以上是关于如何在像犰狳这样的库中扩展一个类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在像 Java 这样的 Javascript 中创建 Bean 类?

如何在 Lua (Love2D) 的库中定义一个类?

如何让android打印掉崩溃系统应用程序的核心转储?

我如何制作 sigpack 来找到犰狳?

MS Chart 中的自动间隔精度

使用类库中的视图 [重复]