2013-07-01 5 views
-1

나는 여기에이 코드를 가지고 :복사 생성자 =

  • 난에 "DerivedClass"에 "= 연산자"를 쓸 수 다음과 같이

    class DerivedClass : public BaseClass { 
        SomeClass* a1; 
        Someclass* a2; 
    public: 
        //constructors go here 
        ~DerivedClass() { delete a1; delete a2;} 
        // other functions go here .... 
    }; 
    

    나의 첫번째 질문은? ,

    • 위의 대답은 '예'라면 당신은 어떻게 "복사본을 만드는 저를 보여줄 수 :

    내 두 번째 질문은 (? 당신의 대답은 '예, 당신은 어떻게 저를 보여줄 수) consructor "연산자를 사용하여 ="당신이 미리 쓴 (심지어 가능하다면)?

+5

예, 가능합니다.하지만 코드를 게시하면 아무 것도 배울 수 없습니다. 자신을 시험해보고 문제가 있으면 게시하십시오. – zennehoy

+0

http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29 – DGomez

+0

일반적인 패턴은 대입 연산자 (복사 및 스왑)에서 복사 생성자를 사용하는 것이지 다른 방법은 사용하지 않는 것입니다. 복사 생성자에서 할당 연산자를 사용하려면 하위 연산자 인 대입 연산자를 사용하기 전에 멤버 변수를 만들어야합니다. – syam

답변

1

copy ctor 및 op =의 본문은 리소스를 저장하려는 방식에 따라 달라집니다 : a1 및 a2 변수. 다른 클래스에 복사해야하는 경우 SomeClass 객체의 전체 복사본을 만드는 일부 함수를 작성해야합니다. 또 다른 경우 - 간단히 포인터 값을 복사 할 수 있습니다. 그런 다음 포인터 값을 사용하고 특히 삭제하는 방법에 매우주의하십시오. 공유 리소스 문제에 대한 가장 쉬운 해결책은 boost :: shared_ptr 또는 C++ 11 std :: shared_ptr과 같은 일부 스마트 포인터를 사용하는 것입니다.

그래서 당신은 당신의 자원을 복사하려는 경우 :

class DerivedClass : public BaseClass { 
    SomeClass* a1; 
    Someclass* a2; 
public: 

    // note: do not forget to assign zeroes to your pointers, unless you use some kind of smart pointers 
    DerivedClass() 
    :a1(0), a2(0){} 

    DerivedClass(const DerivedClass& d) 
       :a1(0), a2(0) 
    { 
     *this = d; 
    } 

    DerivedClass& operator=(const DerivedClass& d) 
    { 
     if (this == &d) 
      return *this; 

     delete a1; 
     a1 = d.a1->clone(); 

     delete a2; 
     a2 = d.a2->clone(); 

     return *this; 
    } 


    //constructors go here 
    ~DerivedClass() { delete a1; delete a2;} 
    // other functions go here .... 
}; 

당신은 또한 당신의 개체를 복사하는 것 SomeClass의 클론() 함수가 필요합니다 : 클래스 SomeClass { 공개 :

SomeClass* clone() const 
    { 
     return new SomeClass(); 
    } 
}; 
+0

복사 생성자에 정의되지 않은 동작이 있습니다. a1이 초기화되지 않은 경우'delete a1'. – Arkadiy

+0

이 바보 같은 버그를 지적하고 고치니 주셔서 감사합니다. – Bogolt

+0

그건 완전히 downvoting보다 낫다. 나는이 해결책이 좋다고 생각한다. –

1

"Rule of Zero"를 존중하여 복사 생성자와 대입 연산자를 작성하는 가장 좋은 방법은 다음과 같습니다.

#include <optional> 
class DerivedClass : public BaseClass 
{ 
    std::optional<SomeClass> a1; 
    std::optional<SomeClass> a2; 
public: 
    //constructors go here 
}; 

컴파일러는 소멸자, 복사본 생성자 및 복사본 할당 연산자에 대한 올바른 코드를 작성합니다. SomeClass이 이동 가능한 경우 이동 할당 및 이동 생성자가 무료로 제공됩니다.

SomeClass이 다형성 인 경우 BogoIt과 같이 clone() 함수가 필요합니다. 그러나이 경우에도 스마트 포인터 (std::unique_ptr이 적합 할 것입니다)를 사용하는 것이 중요합니다.

+0

어떤 표준이 헤더 ''을 정의합니까? ISO/IEC 14882 : 2011 (C++ 11 표준)으로 보이지 않습니다. 표 14와 15 (p435 및 [C 및 C++의 표준 헤더 파일 목록] (http://stackoverflow.com/questions/2027991/)에서 재현)에서는 헤더로 ''을 나열하지 않습니다. –

+0

@Jonathan : oops, [그것은 C++ 14 초안에서 시작하는 네임 스페이스'std'에만 있습니다] (http://en.cppreference.com/w/cpp/utility/optional). 'std :: unique_ptr'과 같은 좋은 C++ 11 대안을 알고 있긴하지만 대상 객체를 복사하여 복사 할 수 있습니까? –

+0

간단히, 아니오 - 열심히 보지 않았습니다. 어쩌면 부스트가 좋은거야? (버전 1.54가 오늘 출시되어 2013-07-01에 수신 이메일로 판단됩니다.) –