强制 Child 类实现深拷贝方法

Forcing Child class to implement deep-copy methods

提问人:user3641187 提问时间:2/18/2023 更新时间:2/18/2023 访问量:50

问:

我有一个父类“Parent”,它需要一个模板参数 K 作为它所操作的数据类型。对于子实现,我想强制它们实现自定义的“deepcopy”方法。

“Runner”类给出了 deepcopy 方法的一个示例用法,该类实质上保存给定 Child 实现的主副本。请注意,在实际示例中,Runner 类型将有多个线程同时访问和更改“master”字段,同时持有锁,因此需要 master 类型的深拷贝。

我目前已经解决了这个问题,如下所示:

#include <iostream>
#include <vector>


template<typename T, typename K>
class Parent{
public:
    virtual void mutate_state(std::vector<K> &data)=0;
    T deepcopy(){
        T res;
        res = static_cast<T&>(*this);
        return res;
    }
};


// some example implementation of Base<T, K>
class Child : public Parent<Child, int>{
private:
    std::vector<int> all_elements;
    int state;
public:
    void mutate_state(std::vector<int> &data) override{
        // do something with data & cfg
        all_elements.insert(all_elements.end(), data.begin(), data.end());
        state++;
        std::cout<<"Called A, state is: "<<state<<std::endl;
    }
    Child(Child &child) {
        std::cout<<"call custom child copy constructor"<<std::endl;
        state = child.state;
    }
    Child& operator=(Child other)
    {
        std::cout<<"call custom child copy assignment"<<std::endl;
        std::swap(state, other.state);
        return *this;
    }
    Child(): state(0){};
};


// an example class mutating the Child
template<typename T, typename K>
class Runner {
private:

    // master Child instance
    T master;
    
public:
    explicit Runner(T child_impl) : master(child_impl) {}

    T get_master_deepcopy() {
        return master.deepcopy();
    }

    void update_master_model(T new_master) {
        master = new_master;
    }

    void update(std::vector<int> &data){
        T temp_deepcopy = get_master_deepcopy();
        temp_deepcopy.mutate_state(data);
        master = temp_deepcopy;
    }
};



int main() {
    Child base_impl;

    // not nice: I have to keep specifying template type K=int although its already been defined in the child implementation
    Runner<Child, int> runner(base_impl);

    std::vector<int> some_data;
    runner.update(some_data);
}


但是,我的实现感觉很麻烦。

  • 目前没有在子实现中“强制”自定义复制运算符实现的机制。如果它们被遗忘,使用复杂的动态分配类型的子实现可能只会导致浅拷贝,我想严格避免。
  • 我的 Runner 不知道 T 的真正类型,它应该被限制为从类 Parent<T, K 继承>
  • 另外,我不喜欢重复声明模板参数 K 的类型 无论是在 Child 的实现中,还是在实例化“Runner”类型时。在实例化“Runner”类型时,有没有办法从已经定义的 Child 类中提取模板类型 K?

如何改进此方法?

C++ OOP 继承 复制构造函数 deep-copy

评论

0赞 463035818_is_not_an_ai 2/18/2023
“Runner 不知道 T 的真实类型”是什么意思? 是知道的.Runnertemplate<typename T, typename K> class RunnerT
0赞 463035818_is_not_an_ai 2/18/2023
强制子类实现方法的方法是使其在基中纯虚拟,就像您已经所做的那样mutate_state
0赞 463035818_is_not_an_ai 2/18/2023
请专注于一个问题
1赞 Yksisarvinen 2/18/2023
这是一个灰色地带,但在代码审查上可能会更好。您有一个工作实现,您希望从代码风格的角度进行改进。尽管如果您将问题分成 3 个单独的问题,它在这里也有效。
0赞 463035818_is_not_an_ai 2/18/2023
您可能想阅读有关 CRTP 的信息,以更好地构建您的方法

答: 暂无答案