ShiLuoTianKongch 2017-06-07 10:44 采纳率: 0%
浏览 717

求助:c++怎么为必要的类添加合适的拷贝构造函数、赋值操作符?

//chair.h

 #ifndef SHAPE__H
#define SHAPE__H

#include <string>
#include <vector>
#include <iostream>

static int gid=0;
int getuid(){
    return ++gid;
}

class Seat{
private:
    int id;
public:
    Seat(){ id=getuid();std::cout<<"Seat() "<<id<<" called\n";}
    ~Seat(){ std::cout<<"~Seat() "<<id<<" called\n";}
    int getid() const {return id;}
};

class Leg{
private:
    int id;
public:
    Leg(){ id=getuid();std::cout<<"Leg() "<<id<<" called\n";}
    ~Leg(){ std::cout<<"~Leg() "<<id<<" called\n";} 
};

class Chair{
private:
    int id;
public:
    Chair(){ id=getuid();std::cout<<"Chair() "<<id<<" called\n";}
    ~Chair(){ std::cout<<"~Chair() "<<id<<" called\n";}
    void setSeat(Seat& s){ seat = s;}
    void setLeg(Leg& l){ legs.push_back(l);}
private:
    Seat seat;
    std::vector<Leg> legs;
};

class Swivel{
private:
    int id;
public:
    Swivel(){ id=getuid();std::cout<<"Swivel() "<<id<<" called\n";}
    ~Swivel(){ std::cout<<"~Swivel() "<<id<<" called\n";}   
};

class OfficeChair : public Chair{
private:
    int id;
public: 
    OfficeChair(){ id=getuid();std::cout<<"OfficeChair() "<<id<<" called\n";}
    ~OfficeChair(){ std::cout<<"~OfficeChair() "<<id<<"  called\n";}
    void setSwivel(Swivel& s) { swivel = s;}
private:
    Swivel swivel;
};

#endif

//chair.cpp

 #include "chair.h"
#include <iostream>
#include <string>
#include<iomanip>

using namespace std;

void test_1(){
    cout<<"test_1 begin\n";
    {
        Seat s;
        Leg L1;
        Leg L2;
        Leg L3;
        Leg L4;
        Swivel sw;
        OfficeChair oc;
        oc.setSeat(s);
        oc.setLeg(L1);
        oc.setLeg(L2);
        oc.setLeg(L3);
        oc.setLeg(L4);
        oc.setSwivel(sw);
    }
    cout<<"test_1 end\n";
}
int main(){
    test_1();
}

测试输出:
/*
test_1 modified begin
Seat() 1 called
Leg() 2 called
Leg() 3 called
Leg() 4 called
Leg() 5 called
Swivel() 6 called
Seat() 7 called
Chair() 8 called
Swivel() 9 called
OfficeChair() 10 called
Seat() copyed 11 1 called
Leg() copyed 12 2 called
Leg() copyed 13 12 called
Leg() copyed 14 3 called
~Leg() 12 called
Leg() copyed 15 13 called
Leg() copyed 16 14 called
Leg() copyed 17 4 called
~Leg() 13 called
~Leg() 14 called
Leg() copyed 18 15 called
Leg() copyed 19 16 called
Leg() copyed 20 17 called
Leg() copyed 21 5 called
~Leg() 15 called
~Leg() 16 called
~Leg() 17 called
Swivel() copyed 22 6 called
~OfficeChair() 10 called
~Swivel() 22 called
~Chair() 8 called
~Leg() 18 called
~Leg() 19 called
~Leg() 20 called
~Leg() 21 called
~Seat() 11 called
~Swivel() 6 called
~Leg() 5 called
~Leg() 4 called
~Leg() 3 called
~Leg() 2 called
~Seat() 1 called
test_1 end
*/

  • 写回答

1条回答

  • diskings 2017-06-07 12:23
    关注

    举个例子,当你的类里面使用的是其他的类当子类,或者你的类里面使用其他的结构体,系统缺省的只有基本数据结构的数值的赋值,还有就是你的类里面使用的是指针类,当你需要赋值的时候,会把同一个地址赋值给对象(A->B),这样,当 你赋值的对像析构的时候,会把那个地址的值析构了(~B),那你原来的类就会析构报错(~A),所以要重写赋值和构造函数

    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误