代码之家  ›  专栏  ›  技术社区  ›  Nav MetroidFan2002

在纯虚拟基类中不创建显式函数就无法复制构造?

  •  2
  • Nav MetroidFan2002  · 技术社区  · 15 年前

    我的目标是做一个类的深度复制,但是一个虚拟类正在引起麻烦。

    #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’
    

    我计划有更多的处理程序类(如handler1、handler2等),这些类继承自VIR,并将拥有自己的唯一成员(如float a或double b等)。所以我把所有处理程序类的getter&setter函数都保存在vir类中是没有意义的。我想将getter和setter方法保留在处理程序类中,因为这些成员对于处理程序类是唯一的。 编译器不允许我这样做。帮助?

    6 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    clone Vir ControlPanel his answer duplicate

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

    Handler

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

    Handler::clone Handler* Vir* Vir::clone

    ControlPanel( const ControlPanel& c )
        : v( c.v->clone() )
    {
    }
    
        2
  •  2
  •   Andrew Aylett    15 年前

    duplicate() copyFrom(Abs other)

        3
  •  0
  •   luke    15 年前
        4
  •  0
  •   Prasoon Saurav    15 年前

    Vir *v Handler *v;

    Vir setI() getI()

    class Vir//pure virtual class
    {
        public:
        virtual void hi()=0;
        virtual int getI()const =0;
        virtual void setI(int)=0;
    };
    
        5
  •  0
  •   Steve Townsend    15 年前

    getI setI Vir

        6
  •  0
  •   Nav MetroidFan2002    15 年前

    #include<iostream>
    using namespace std;
    
    class Vir//pure virtual class
    {
        public:
        virtual void hi()=0;
        virtual int getI() {std::cout << "Inside Base class" << std::endl;}
        virtual void setI(int i) {cout<<"In base"<<endl;}
        virtual int getX() {}
        virtual void setX(int x) {}
    };
    class Model
    {
        public:
        int x;
        Model(const Model& mm) {x=mm.x;}
        Model():x(555) {cout<<"Model constructor called"<<endl;}
        int getX() {return x;}
        void setX(int xx) {x=xx;}
    };
    
    class Handler:public Vir
    {
        public:
        int i;
        Model *m;
    
        Handler() {m=new Model;cout<<"Handler constructor called"<<endl;}
        Handler(const Handler& h)
        {
        std::cout << "Inside Handler @lineNumber:" << __LINE__ << std::endl;
        i=h.i;
        m=new Model(*h.m);
        }
        Handler(int val):i(val) {}
        ~Handler() {delete m;}
        void hi() {cout<<"Value of i="<<i<<endl;}
        int getI() {return i;}
        void setI(int j) {i=j;}
        int getX() {return m->getX();}
        void setX(int xx) {m->setX(xx);}
    };
    
    class ControlPanel
    {
        public:
        int abc;
        Vir *v;
        ControlPanel(const ControlPanel& c)//copy constructor
        {
        std::cout << "Inside ControlPanel @lineNumber:" << __LINE__ << std::endl;
            v=new Handler((Handler&)*(c.v));
        }
        void initialize() {v=new Handler();v->setI(10);abc=222;}
        void hi() {v->hi();}
        ControlPanel() {}
        ~ControlPanel() {delete v;}
    };
    
    int main()
    {
        ControlPanel cc;
        cc.initialize();
        cc.hi();    
        cout << "(cc.v)->i::" << (cc.v)->getI() << endl;
        cout<<"x value cc="<<(cc.v)->getX()<<endl;
        ControlPanel bb(cc);//copying cc into bb
        cout << "(bb.v)->i::" << (bb.v)->getI() << endl;
        cout<<"x value bb="<<(bb.v)->getX()<<endl;
        (cc.v)->setI(999);
        (cc.v)->setX(888888888);
        cout << "(cc.v)->i::" << (cc.v)->getI() << endl;
        cout << "(bb.v)->i::" << (bb.v)->getI() << endl;
        cout<<"x value cc="<<(cc.v)->getX()<<endl;
        cout<<"x value bb="<<(bb.v)->getX()<<endl;
    }//main
    /*
    Output:
    Model constructor called
    Handler constructor called
    Value of i=10
    (cc.v)->i::10
    x value cc=555
    Inside ControlPanel @lineNumber:52
    Inside Handler @lineNumber:32
    (bb.v)->i::10
    x value bb=555
    (cc.v)->i::999
    (bb.v)->i::10
    x value cc=888888888
    x value bb=555  */