2011-08-25 3 views
1

현대 C++ 스타일에 관해 들었던 한 가지 경험은 새 포인터를 사용하거나 삭제할 필요가 없으며 대신 스마트 포인터를 사용해야한다는 것입니다. 그래서 내가 멤버 중 하나가 다른 객체에 대한 포인터 인 클래스가있을 때 이것을 수행하는 방법. 스마트 포인터를 사용하면 삭제할 필요가 없지만 새로운 개체를 만들어야합니다. 예 : 아래의 "표준적인"현대 C++ 스타일입니까, 아니면 어떻게해야합니까?"modern C++"에서 클래스 멤버로서의 객체에 대한 포인터

 

#include 
#include 

class B { 
public: 
    B() { std::printf("constructing B\n");} 
    ~B() { std::printf("destroying B\n");} 
}; 

class A { 
public: 
    A() 
    { 
     std::printf("constructing A\n"); 
     b = std::unique_ptr(new B()); 
    } 
    ~A() { std::printf("destroying A\n");} 

private: 
    std::unique_ptr b; 
}; 

int main() 
{ 
    A a; 
    return 0; 
} 

 
+2

나는 Boost가 이것을 가지고 있고, C++ 0x가 비슷한 것을 가지고 있다고 생각하지만, boost :: make_shared 을 사용할 수있다. boost :: shared_ptr (new int (9))' – Dawson

+2

더 이상 말하지 않고 "현대적인 스타일"이라고 말하려고하는 사람들의 말을 듣지 마십시오. 조언은 좋거나 나쁠 수도 있지만, 작성중인 특정 코드에서 귀하와 후임자에게 도움이되는 내용의 맥락에서 직접 평가해야합니다. 그렇지 않으면, 당신은 단지화물 컬트에 참여하고 있습니다. –

+0

나는 당신이 RAII와 관련하여 C++ 프로그램을 설계 할 것을 권고하고 혼란 스럽다고 생각한다. 명시 적 소멸자를 구현할 필요가 없거나 최소화 할 필요가있다. (삭제로 객체를 명시 적으로 할당 해제 할 필요가 거의 없다는 것을 의미한다.) – mloskot

답변

7

new을 사용합니다. new을 사용할 때 아무런 문제가 없으므로 최대한 드물게 사용해야합니다.

(그 사용이 항상이 RAII 일종의 캡슐화해야하기 때문에 반면에 delete는 스마트 포인터 또는 컨테이너처럼 취급, 사용하지 거의 안됩니다.)


주를이 스마트 포인터를 사용할 때는 항상 new의 결과를 명명 된 스마트 포인터에 할당하거나 reset을 사용해야합니다. 귀하의 경우에는, 당신은 사용하고자하는 것 :

A() : b(new B()) { } 

나 :

A() 
{ 
    std::unique_ptr<B> x(new B()); 
    b = std::move(x); 
} 

나 :

A() { b.reset(new B()); } 

(이 중요한 이유를 들어 볼 수있는 "모범 사례"절을) boost::shared_ptr documentation.

+0

+1. 클래스 생성자 내에서'new'를 사용하는 것은 모든 새로운 표현식이 관리 객체의 생성자에 즉시 포함되어있는 한 괜찮습니다 (단일 책임 원칙). 독립적 인 코드에서는'make_shared'를 사용하여'new'를 피할 수 있습니다 만,'unique_ptr'을 사용하면 다시 잘 배치 된'new'가 괜찮습니다. –