2011-03-30 2 views
2

클래스에 포인터가있을 때 C++에서는 항상 copy constructor와 = 연산자가 오버라이드되어야한다고 들었습니다. 나는 그것에 대해 조사했고 포인터가 클래스 객체를 가리킬 때에 대한 설명을 발견하지 못했다. 클래스 생성자 및 = 연산자 오버라이드를 클래스 객체의 포인터로 정의하는 방법은 무엇입니까?

내 문제를 설명하기 위해 :

class Figure 
{ 
    Figure(); 
    Figure(const Figure& figure) 
    Figure(float density); 
    ~Figure(); 
    virtual float volume()=0; 

    Figure *next; 

protected: 
    float density; 
}; 

class Sphere: public Figure 
{ 
    Sphere(); 
    Sphere(float r); 
    Sphere(float r, float density); 
    ~Sphere(); 
    float volume(); 

private: 
    float r; 
}; 

나는 클래스 그림에 대한 복사 생성자을 시도했다. 마지막 줄에서 "추상 클래스 유형 Figure의 객체가 허용되지 않습니다"라는 오류가 발생합니다. 내가 뭘 잘못하고 있는지 모르겠다. 할당 연산자를 재정의하는 방법을 모르겠습니다.

Figure::Figure(const Figure& figure) 
{ 
    this->tip = figure.tip; 
    this->density = figure.density; 
    if (figure.next) 
     next = new Figure(*figure.next); 
} 
+2

사실, 규칙은 복사 생성자, 할당 연산자 또는 소멸자가있을 때마다 3 개가 모두 필요할 것입니다. 이것은 일반적으로 "3 원칙"또는 "3 대 법칙"이라고 불립니다. – ildjarn

답변

3

일반적인 해결책은 필요한 작업을 추상화하고 하위 클래스에서 지원하는 것입니다.

class Figure { 

    virtual Figure * clone() const = 0; 
}; 


class Sphere : public Figure { 

    Figure * clone() const { 
    return new Sphere(*this); 
    } 
}; 

물론 Sphere 복사 생성자를 올바르게 구현하십시오.

1

대신 Sphere에 복사 생성자를 넣습니다. Figure 유형의 클래스를 직접 만들려고합니다. Figure가 abstract이므로 작동하지 않습니다.

0

코드에 따르면 Figure에는 next이라는 데이터 멤버가없고 Sphere 만 데이터 멤버가 있습니다.

+0

내 원래 코드에서는 그림 클래스에 있습니다. 내 게시물을 수정합니다. – Anajrob

관련 문제