添加第3个库类型的成员字段

时间:2016-07-12 12:57:02

标签: c++ c++11

我正在处理一个包含类型(我们说矩形)的库,如下所示:

namespace some_lib{
    struct rectangle{
        int x;
        int y;
        int width;
        int height;
    };
}

我有一个这个矩形的矢量(非常大的矢量可能是10 ^ 9矩形),我想计算这个矩形的区域并在程序的许多地方使用它。

我想要一次计算它。所以我应该把它存放在某个地方。我无法编辑结构。我建议这个解决方案:

namespace my_own_program{
    struct rectangle_wrapper{
        some_lib::rectangle rect;
        int area;
        operator some_lib::rectangle() const { return rect; }
    };
}

现在我可以将该区域存储在此结构中,如果我想将向量传递给库以对其执行某些处理,我必须在将其复制到另一个向量时进行转换。

我觉得这种方法很垃圾。我解决了计算区域的问题,但每次我需要在库中处理它看起来很可怕。

我的问题:

如何以更好的方式实现这一目标?

2 个答案:

答案 0 :(得分:1)

好吧,如果你坚持使用该库并且你必须多次传递矢量,那么我建议创建一个"阴影矢量"它保存索引i处每个矩形i的区域。 这取决于矢量的使用方式。如果你的流失率很高,那么这显然不是你想要的方法,但是你不应该首先使用矢量。

您可以将两个向量包装在代码中使用的自定义类中,以访问矩形并将向量传递给库。

答案 1 :(得分:0)

我更喜欢另一种解决方案:

struct rectangle{
        int x;
        int y;
        int width;
        int height;
};

struct extended_rectangle : public rectangle {
    int area;
};

在这种情况下,您可以将extended_rectangle传递给任何期望矩形类型的函数(可能作为参考传递)

更新:在阅读Aconcagua的评论之后,更准确一点:

如果你想调用第三个函数作为参数接收一个向量 - 一个连续的内存块 - 与对象序列(即作为一个c向量)你没有解决方案,正如Aconcagua指出的那样(谢谢你,阿空加瓜,我没想过那个细节。)

但是,如果你选择了不能作为连续对象参数传递的rectangle_wrapper,我更喜欢我的extended_rectangle解决方案。

如果您希望对象位于向量中,您可以使用基于对象指针向量的任何解决方案,以便利用多态性(您可以将* v [i]作为矩形处理)。