c++ - 调用基类克隆实现
问题描述
试图实现克隆模式,但坚持函数调用顺序:
我有一个带有多态类(脚本)向量的基类。
基类实现了一个克隆函数,它本质上是复制自身及其所有成员(mScripts 向量)。
派生类也实现了自己版本的克隆功能,并负责其成员的克隆。目前这只是一个整数。
问题:我应该如何在派生类的克隆函数中调用基类的克隆函数,以便每个类都负责克隆自己的成员?
作为一个丑陋的解决方法,现在,我所有派生类的克隆函数手动执行 mScripts 向量克隆,基本上重复相同的代码。
class Base
{
public:
virtual std::unqique_ptr<Base> clone()
{
std::unique_ptr<Base> clonedInstance = std::make_unique<Base>();
//clone the underlying vector
for(int i = 0; i < mScripts.size(); ++i)
{
clonedInstance->mScripts.push_back(std::move(mScripts[i]->clone()));
}
return std::move(clonedInstance);
}
std::vector<std::unique_ptr<ScriptBase>> mScripts; //polymorphic array
};
class Derived : public Base
{
public:
Derived(const int x) : Base(), mX(x)
{
}
std::unqique_ptr<Base> clone()
{
//calling base::clone() here?
return std::unique_ptr<Base> clonedInstance = std::make_unique<Derived>(mX);
}
private:
int mX;
};
解决方案
正确实现复制构造函数,那么每个克隆函数就简单了return std::make_unique<Derived>(*this);
class Base
{
public:
Base() = default;
Base(const Base& rhs) // default is not fine here
{
for (const auto& script : rhs.mScripts)
{
mScripts.push_back(script->clone());
}
}
virtual ~Base() = default;
virtual std::unique_ptr<Base> clone() const
{
return std::make_unique<Base>(*this);
}
std::vector<std::unique_ptr<ScriptBase>> mScripts; //polymorphic array
};
class Derived : public Base
{
public:
Derived(int x) : Base(), mX(x) {}
Derived(const Derived&) = default; // Default is fine here
std::unique_ptr<Base> clone() const override
{
return std::make_unique<Derived>(*this);
}
private:
int mX;
};
推荐阅读
- go - 在字节位置读取文件
- php - 如何根据用户的选择显示数组中的某些内容
- r - spss与R中的倾向得分匹配
- c - 在c中创建帕斯卡三角形
- reactjs - Git 存储库已初始化,如何在终端中运行 npm,(打开或关闭?)
- python - 列表是按值传递还是按引用传递?
- java - Spring Boot - 如何根据构建环境 QA 或 PROD 更改 Spring Boot 应用程序 jar 名称
- dialogflow-es - 使用静态响应的 Dialogfow webhook
- sql-server - SQL Server 将最近的记录与另一个表匹配
- python - 从计数 DNA 序列到表格的元组