gpt4 book ai didi

C++ 复制构造函数,重载赋值运算符,方法 get()

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:42 26 4
gpt4 key购买 nike

我在我的大学里进行了一次 C++ 练习。所以他们要求我制作复制构造函数和重载赋值运算符 = 的类(class)。所以我做到了,而且效果很好。他们说我的方法 get() 和我的复制构造函数以及重载赋值运算符是错误的。不幸的是,练习效果很好。他们也没有要求 main()。

#include <iostream>

using namespace std;

class DIcourse{

private:
int *ids;
int numstudents;
char *title;
char *description;
public:
DIcourse();
~DIcourse();
DIcourse(const DIcourse &tmp);
DIcourse operator=(const DIcourse &tmp);
int const get_num();
char const *get_title();
char const *get_description();
int const *get_ids();
int set_num_ids(int num);
char set_description(char *tmp);
char set_title(char *temp);
};

DIcourse :: DIcourse(){
ids=NULL;
numstudents=0;
title=new char[50];
description=new char[200];
}

DIcourse :: ~DIcourse(){
delete [] ids;
delete [] title;
delete [] description;
}

DIcourse :: DIcourse(const DIcourse& tmp){
numstudents=tmp.numstudents;
ids=new int[numstudents];
for(int i=0;i<numstudents;i++){
ids[i]=tmp.ids[i];
}
title=tmp.title;
description=tmp.description;
}

DIcourse DIcourse::operator=(const DIcourse &tmp){
delete [] ids;
numstudents=tmp.numstudents;
ids=new int[numstudents];
for(int i=0;i<numstudents;i++){
ids[i]=tmp.ids[i];
}
delete[] description;
delete[] title;
description= new char[200];
title= new char[50];
description=tmp.description;
title=tmp.title;
return *this;
}

const int DIcourse :: get_num(){
return numstudents;
}

const char* DIcourse :: get_title(){
return title;
}

const char* DIcourse :: get_description(){
return description;
}

const int* DIcourse :: get_ids(){
return ids;
}

int DIcourse :: set_num_ids(int num){
numstudents++;
int *temp_array;
temp_array=new int[numstudents];
temp_array[numstudents-1]=num;
if(ids!=NULL){
for(int i=0; i<numstudents-1; i++){
temp_array[i]=ids[i];
}
delete [] ids;
}
ids=temp_array;
}

char DIcourse :: set_description(char *tmp){
int i=0;
while(tmp[i]!='\0'){
description[i]=tmp[i];
i++;
}
description[i]='\0';
}

char DIcourse :: set_title(char *temp){
int i=0;
while(temp[i]!='\0'){
title[i]=temp[i];
i++;
}
title[i]='\0';
}

最佳答案

您的文案分配应该是:

  DIcourse& operator=(const DIcourse &tmp);
//^^return reference

与此同时,您应该检查 copy assignment operator self-assignment .

由@Mooing Duck 提供:您当前的复制赋值运算符实现中存在内存泄漏:

  DIcourse DIcourse::operator=(const DIcourse &tmp){
delete [] ids;
numstudents=tmp.numstudents;
ids = new int[numstudents];
for(int i=0;i<numstudents;i++){
ids[i] = tmp.ids[i];
}
delete[] description;
delete[] title;
description= new char[200]; //^^
title= new char[50]; //^^^memory leak here and above
description=tmp.description; //^^this is not copy char*
title=tmp.title; //^^this is not copy char*
return *this;
}
}

你可能想看看Copy-And-Swap Trick实现复制赋值运算符。

您的get 函数应该是:

int  get_num() const;
//^^const modifier should be here,
//meaning that it access the value but does not change it

const 修饰符问题与您的其他 getter 类似。

关于C++ 复制构造函数,重载赋值运算符,方法 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073152/

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