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