2013-06-21 5 views
0

클래스에 다른 클래스에서 사용 된 생성자에 의해 초기화 된 std::unique_ptr이 포함되도록하고 싶습니다. myPointer 생성자에서 설정되는 클래스의 소스 파일에 다음힙 할당 포인터가 필요하지만 스택 할당 포인터가 주어진다

class ObjectA 
{ 
public: 
    ObjectA(); 
    ~ObjectA(); 
    void SomeFunction(); 

private: 
    std::unique_ptr<ObjectB> myPointer; 
} 

SomeFunction()에 사용 :

그래서 나는이 같은 std::unique_ptr를 포함하는 클래스를 가지고있다.

ObjectA::ObjectA() 
{ 
    ObjectC objectC; 
    myPointer = std::move(std::unique_ptr<ObjectB>(objectC.getPointer())); //setup pointer 
} 

ObjectA::~ObjectA() {} 

void ObjectA::SomeFunction() 
{ 
    //use myPointer here 
} 

하지만 문제는 내가 SomeFunction()myPointer을 사용할 수 없다는 것입니다, 여기에 이유.

분명히 myPointer은 생성자가 실행 완료시 파괴되지 않도록 힙에 할당되어야합니다. ObjectC을 가정하고 결과적으로 함수는 외부 라이브러리에서 가져온 것입니다. ObjectC::getPointer()을 호출하면 반환되는 포인터는 아마도 힙에 할당 된 스택에 할당됩니다. 지금은 생성자가 실행을 마친 직후에 오류가 발생하기 때문에이 경우라고 가정합니다.

기본적으로 나는 다른 곳에서 사용할 수있는 포인터를 제공하는 함수에 의존하고 있습니다. 그러나이 함수는 힙 대신 스택에 개체를 할당합니다.

이중 포인터로이 문제를 해결할 수있는 특별한 방법이 있습니까? 아니면 각 실행 블록 안에 포인터를 사용할 때마다 ObjectC::getPointer()으로 전화해야합니까? 함수 내에서 많은 함수가있는 경우 myPointer에 의존하는 함수 당 ObjectC::getPointer()을 호출하면 중복 될 수 있지만 더 좋은 방법은이 문제를 해결할 수 있는지 모르겠지만 함수 (ObjectC::getPointer())가 강제해서는 안됩니다. 저 중복으로.

+1

확실 해요'objectC'는 객체에 대한 가리키는 시간을 제어하지 않습니까? 그것이 사실 인 것처럼 보인다. 클래스의 멤버로서'ObjectC objectC'을 가지고 있어야합니다. 또한,'ObjectC objectC();'는'ObjectC objectC;'이어야합니다 (전자는 함수 선언입니다). –

+1

ObjectB와 ObjectC가 어떻게 정의되어 있는지 알지 못해도 확실히 말할 수는 없습니다. –

답변

1

ObjectC::getPointer()으로 전화하면 "a"포인터를 얻지 못합니다. 이 함수는 포인터에서 유효한 연산과 특히 처리 방법을 지정해야합니다.

일반적으로, 이는 delete이지만, 예를 들어. fclose. 설명서를 읽어야합니다. 반환 된 포인터의 수명이 objectC의 해당 수명과 일치하면 objectC의 유효 기간은 myPointer과 일치해야합니다. 그래서 아마도 회원이되어야하고, 차례로 myPointer이 중복 될 수 있음을 의미합니다. 당신은 그냥 대체 할 수 있습니다 private: ObjectB& getB() { return *myObjectC.GetPointer(); }

관련 문제