2017-02-07 1 views
0

저는 C++ 11 프로젝트를 진행하고 있습니다. 그 안에 std::string 데이터를 가지고있는 shared_ptr이 있습니다.shared_ptr을 사용할 때 소멸자, 복사 생성자, 할당 연산자를 구현해야합니다.

class Base { 
public: 
    Base() : Base(string()) {} 
    virtual ~Base() = default; 
    Base(const string &str) { 
    str_ = std::make_shared<string>(str); 
    } 
private: 
    std::shared_ptr<std::string> str_; 
}; 

내 질문은 : 여기에 내가 생성자와 할당 연산자가 복사 돌봐 복사, 소멸자 str_ 무료로 구현해야합니까? 컴파일러가 제공하는 기본값을 사용하면 충분합니까? 나는 "올바른"입니다 Base *b1 = new Base("string");

+2

아니요, 만들 필요가 없습니다. –

+0

왜 shared_ptr을 사용하여 문자열을 보유하고 있습니까? 정말이 문자열을 참조하도록이 객체의 복사본을 원하십니까? 그렇다면 왜? –

+3

기본적으로 제공되는 단순한 memberwise-copy만으로 충분하기 때문에 컴파일러가 제공하는 기본 구현에 의존 할 수 있습니다. –

답변

1

기본 생성자와 대입 연산자 (복사 및 이동 모두)에 의해 Base b1("string"); 또는 힙 스택 중 하나를이 클래스의 객체를 생성 할 수 있도록합니다. 내가 인용에서 "올바른"넣어 이유는 당신이 Base 클래스에서 클래스를 파생하려는 문제 (가상 소멸자 주어지고, 이름)가, 그리고 당신은 같은 것을 작성하는 경우 : 특히

Base *p1 = new Derived1("foo", "bar"); 
Base *p2 = new Derived1("bar", "foo"); 
*p1 = *p2; // Will compile, but probably won't do what you want. 

을 할당은 p2이 가리키는 개체의 Base 부분을 복사하지만 어떤 Derived1 부분도 복사하지 않습니다.

나는 생성자와 할당 연산자를 삭제하거나 보호 할 것이다.

class Base { 
public: 
    Base() : Base(string()) {} 
//Either 
    Base(const Base& rhs) = delete; 
    Base& operator=(const Base& rhs) = delete; 
//OR 
protected: 
    Base(const Base&rhs) = default; 
    Base& operator=(const Base& rhs) = default; 
    Base(Base&&rhs) = default; 
    Base& operator=(Base&& rhs) = default; 
public: 
//END 
    virtual ~Base() = default; 
    Base(const string &str) { 
    str_ = std::make_shared<string>(str); 
    } 
private: 
    std::shared_ptr<std::string> str_; 
}; 
+0

예, 파생 클래스를 만듭니다. 정교하게 작성하십시오. 왜 내가 "보호"해야합니까? 감사합니다. – RuLoViC

+0

그렇지 않으면'* p1 = * p2'는 기본 클래스 값 *을 할당하지만 파생 요소! *는 할당하지 않기 때문입니다. 나는 대답을 편집했다. –

관련 문제