2012-02-20 2 views
2

은 내가 isCircle이 (가상의 방법으로) 단지 인터페이스 클래스C++ 기본 복사 및 대입 연산자

class Circle : public isCircle{ 
    private : 
    int x; 
    int y; 
    vector<Circle*> _neighbors; 
} 

있고, _neighbors 서클 포인터가이 인스턴스에 의해 할당되지 않은에 포함되어 있습니다. 내 질문에이 경우 기본 복사 및 할당 연산자 기본적으로 깊은 복사본을 수행 할 것입니다?

+7

포인터의 딥 복사는 가능하지만 포인터는 가리키는 포인터가 아닙니다. – ildjarn

+0

그리고 "_"앞에 이름을 사용하지 마십시오. –

+5

@DmitryKachko 왜 안 되니? –

답변

0

기본 생성 된 복사본 생성자와 할당 연산자는 얕은 복사본입니다.

이 클래스의 인스턴스간에 포인터를 공유하는 경우 포인터 벡터를 사용하는 대신 스마트 포인터 벡터를 사용하는 것이 좋습니다.

9

C++ 유형의 기본 복사 생성자는 인스턴스가 생성되는 객체의 해당 필드를 사용하여 인스턴스의 각 필드에서 복사 생성자를 호출하여 작동합니다. 귀하의 예제에서 대략적으로

Circle(const Circle& other) : 
    x(other.x), 
    y(other.y), 
    _neighobrs(other._neighbors) { 

} 

으로 번역됩니다. 각 필드의 복사 생성자에 대한 구현 세부 사항입니다. 이 경우 vector<T>의 복사 생성자는 약간의 조합입니다. 그것은 각각의 vector<T>이 자신의 독립적 인 배열을 갖도록 기본 저장소를 깊이 복사합니다. 그러나 복사 생성자를 사용하여 요소를 복사합니다. 이 경우 포인터 유형이므로 얕은 방식으로 복사됩니다.

관련 문제