如何动态更新依赖于其他成员的成员?

时间:2020-09-17 14:27:16

标签: c++ class oop c++17

假设我有一个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。但是有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

当MyClass._vec更改时,如何动态更新MyClass.shape?

编写一个更新shape的函数,并在更改_vec时调用它。

但是有更好的方法吗?

完全不使用shape成员,而是在需要这些值时调用_vec.size()_vec.begin()->size()。这样就无需更新,也没有多余的重复内存浪费,并且该类的用户无法打破明显缺少的不变式。