2013-06-12 2 views
0

나는 나의 대학에서 C++로 연습을했다. 그래서 그들은 복사 생성자와 오버로드 할당 연산자 =를 만들도록 요청했습니다. 그래서 내가 그랬고 괜찮 았어. 그들은 나에게 methos get()과 복사 생성자와 오버로드 할당 연산자에서 잘못되었다고 말했다. 불행히도 운동은 잘 진행되었습니다. 또한 그들은 main()을 요구하지 않았다.C++ 복사 생성자, 오버로드 할당 연산자, metho get()

#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'; 
} 
+2

당신은 확실히 [_good_ 책] 읽어야합니다 (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). 이것은 매우 나쁜 C++ 코드입니다. 그것은 장소의 포인터를 사용하고 예외 - 안전하지 않습니다. –

+1

메모리 할당을 줄이고'char * '대신'std :: string'을 사용하십시오. –

+0

@ThomasMatthews - 대학 운동이므로 동적 메모리 할당을 사용하는 방법을 배우는 것이 가치있는 일일 수 있습니다. –

답변

4

사본 할당해야한다 :

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

한편, 당신이 copy assignment operator self-assignment 확인해야합니다. @Mooing 오리의 호의에 의해

: 당신이 당신의 현재 복사 할당 연산자 구현에서 메모리 누수가 :

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 수정 문제는 다른 게터 비슷합니다.

+3

메모리 누수 또는 이중 삭제에 대한 언급이 없습니까? –

+0

@MooingDuck 당신 말이 맞아요. 구현 세부 사항을 살펴 보지 않았습니다. 지금 추가하려고합니다. – taocp

+1

또한,'set_description'와 친구들은 배열의 끝에 지나서 글을 쓸 것입니다 ... –

1

언급 한 taocp 이외에도 할당 연산자에서 자신에게 할당하지 않은 것을 확인해야합니다.

DIcourse &DIcourse::operator=(const DIcourse &tmp){ 

if (this != &tmp) { 
    ... Do the business here 

} 
return *this; 
} 
+0

도움 주셔서 감사합니다! – KostasRim

관련 문제