gpt4 book ai didi

c++ - 不在纯虚基类中创建显式函数就不能进行拷贝构造吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:26 24 4
gpt4 key购买 nike

我的目标是对一个类进行深拷贝,但虚拟类造成了麻烦。

#include<iostream>
using namespace std;

class Vir//pure virtual class
{
public:
virtual void hi()=0;
};

class Handler:public Vir
{
public:
int i;
Handler() {}
Handler(int val):i(val) {}
void hi() {cout<<"Value of i="<<i<<endl;}
int getI() const {return i;}
void setI(int j) {i=j;}
};

class ControlPanel
{
public:
Vir *v;
ControlPanel(const ControlPanel& c)//copy constructor
{
v=new Handler;
v->setI(c.getI());
}
int getI()const {return v->getI();}

void initialize() {v=new Handler(10);}
void hi() {v->hi();}
ControlPanel() {}
~ControlPanel() {delete v;}
};

int main()
{
ControlPanel cc;
cc.initialize();
cc.hi();
ControlPanel bb(cc);//copying cc into bb
}

编译错误信息:

test.cpp: In copy constructor ‘ControlPanel::ControlPanel(const ControlPanel&)’:
test.cpp:28: error: ‘class Vir’ has no member named ‘setI’
test.cpp: In member function ‘int ControlPanel::getI() const’:
test.cpp:30: error: ‘class Vir’ has no member named ‘getI’

我计划有更多的 Handler 类(如 Handler1、Handler2 等),它们继承自 Vir 并将拥有自己独特的成员(如 float a;或 double b;等)。所以我把所有Handler类的所有getter&setter函数都保留在Vir类中是没有意义的。我想在 Handler 类中保留我的 getter 和 setter 方法,因为成员对于 Handler 类是唯一的。编译器不允许我这样做。帮忙?

最佳答案

也许我遗漏了一些东西,但是在 Vir 上使用虚拟 clone 方法不是更好吗?这意味着您可以避免在您自己的答案中概述的 ControlPanel 复制构造函数中进行令人讨厌的转换。这与@Andrew Aylett 在 his answer 中建议的相同使用 duplicate 而不是 clone

有点像

class Vir
{
public:
virtual Vir* clone() const = 0;
...
};

Handler中实现

Handler* Handler::clone() const
{
return new Handler( *this );
}

注意协变返回类型的使用,即 Handler::clone 允许返回 Handler* 而不仅仅是 Vir*并且仍然是 Vir::clone 的有效覆盖。

这使得 ControlPanel 复制构造函数变得简单

ControlPanel( const ControlPanel& c )
: v( c.v->clone() )
{
}

关于c++ - 不在纯虚基类中创建显式函数就不能进行拷贝构造吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3813964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com