假设我有一个MyClass
类:
class MyClass{
private:
vector<vector<float>> _vec;
public:
MyClass(vector<vector<float>> arg){
_vec = arg;
// shape is a 2-element vector where shape[0] = #elems in _vec
// and shape[1] = #elems in _vec[0]
shape.push_back(_vec.size());
shape.push_back(_vec.begin()->size());
}
vector<int> shape;
};
现在假设我有MyClass的成员函数func
:
MyClass MyClass::func(){
MyClass res(this->_vec);
// delete the first element of `res._vec`
res._vec.erase(res._vec.begin());
return res;
}
现在,如果我这样做:
MyClass A = {{1, 2}, {3, 4}}; // A.shape[0] = 2, A.shape[1] = 2
MyClass B = A.func(); // B._vec is {{3, 4}} but B.shape[0] is still 2
这里B._vec
发生了变化,但是B.shape
并未相应地“更新”。
当MyClass.shape
更改时,如何动态更新MyClass._vec
?执行此操作的一种方法是改为使成员函数MyClass.shape()
每次调用时都会检查当前的MyClass._vec
。但是有更好的方法吗?
答案 0 :(得分:3)
当MyClass._vec更改时,如何动态更新MyClass.shape?
编写一个更新shape
的函数,并在更改_vec
时调用它。
但是有更好的方法吗?
完全不使用shape
成员,而是在需要这些值时调用_vec.size()
和_vec.begin()->size()
。这样就无需更新,也没有多余的重复内存浪费,并且该类的用户无法打破明显缺少的不变式。