我有一个包含一组C动态数组的类,这些数组的大小都相同,其中一个成员就是这些数组的大小:
class stuff {
int size;
float *abc;
float *def;
// etc.
};
为了简化这个类(以及许多其他具有类似布局的类)的内存管理,我想使用标准容器。但是我必须保持C数组(和向量)提供的对齐约束,因为这些数据将在很多C函数中传递。
我的问题是每个向量都有自己的大小,这是多余的,如果由于某种原因而改变其大小而不是其他大小,则可能导致错误。
有没有办法强制数组/向量/ whatevers总是相同的大小?
答案 0 :(得分:4)
这也许就是这样一种情况,即创建一个自己的类来管理内存是有意义的(没有业务逻辑,只有内存)。
当然,你可以围绕矢量阐述这个类:
#define CHECK_CLASS_INVARIANT() \
ClassInvariant inv##__LINE__ (*this); (void) inv##__LINE__;
class Foo {
public:
size_t size() const { return _a.size(); }
float* getA() { return &_a[0]; }
float* getB() { return &_b[0]; }
void push(float a, float b) {
CHECK_CLASS_INVARIANT()
_a.push_back(a);
_b.push_back(b);
}
private:
struct ClassInvariant {
ClassInvariant (Foo& f): _f(f) {}
~ClassInvariant () { assert(_f._a.size() == _f._b.size()); }
Foo& _f;
}; // struct ClassInvariant
std::vector<float> _a;
std::vector<float> _b;
};
我们确保始终检查类不变量(在变异方法中)以确保它始终适用。
注意:这里有一个小小的流程,如果_b.push_back(b);
抛出,那么_a
被扩展而_b
没有,这可以在try / catch块中处理或者正如SteveJessop恰当地评论的那样,通过(1)预先在两个向量中保留足够的空间并且(2)推入它们。
答案 1 :(得分:1)
没有通用和明确的方法来约束矢量。约束必须作为算法的不变量来强制执行;每当你push_back
数据到一个向量时,也将它推送到另一个向量。 (务必保留向量private
。
答案 2 :(得分:1)
如何保持一对浮动的向量呢?
答案 3 :(得分:0)
我不是100%确定我明白你的问题是什么,但看起来你想要这样的东西:
template<int SIZE> class stuff {
float abc[SIZE];
float def[SIZE];
// etc.
};
这没有内存管理问题 - 你可以创建一个&#34;东西&#34;堆栈或堆上的类,它不需要析构函数。