2015-01-19 4 views
4

나는 추상 유형의 선택적 객체를 갖고 싶습니다. 그러나, 부스트 : : 선택 추상 유형의 실패 : 그냥 하나 실행 가능한 솔루션을하지 않는 것 포인터를 사용하여boost :: optional abstract 클래스 유형

error: invalid new-expression of abstract class type ‘A’ 

#include <boost/optional.hpp> 
class A { 
    virtual int getInt() = 0; 
}; 
class B : public A { 
    int getInt() { return 666; }; 
}; 

int main() { 
    boost::optional<A> maybeAnA; 
    boost::optional<A> another(maybeAnA); 
}; 

결과, 몇 가지 기능이 포함 된 개체를 반환해야하므로 함수의 호출자가 해당 멤버 변수의 소유자가 될 것이라고 예상하는 것은 아니지만 멤버 인 선택적 값.

+4

포인터 및 소유권에 관해서는 포인터의 "소유권"을 양도 가능하게하려면 왜 사용하지 않을까요? ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr) (또는 부스트 상당)? –

+1

만약'optional'이 타입의 컨테이너처럼 작동하게하려면'unique_ptr '을 사용해야합니다. (이미 nullable, transferrable이며 자원을 소유하고 있습니다). – sehe

답변

9

옵션 가치의 의미를 가지고, 그래서 당신은 자신 당신이 당신이 A을 인스턴스화 할 수 없습니다 같은 이유로 원하는 수행 할 수 없습니다 대신,

A anA; 

당신이 는 옵션 값으로을 참조에 관심이있을 것 때문에 소유의/에게 그것을 포함 :

이 라이브러리는 템플릿 파라미터 T가 참조 형태 일 수있다.참조 몇 가지 제한 사항이 적용 실물이없는 일부 조작이 경우 사용할 수 없습니다 때문에

:

  • 변환 생성자 할당을
  • 상대 고정 건설
  • 상대 고정 할당
  • 변환
  • 포인터를 통한 값 접근

A&, 하지만 옵션

Live On Coliru

#include <boost/optional.hpp> 

struct A { 
    virtual int getInt() = 0; 
}; 

struct B : A { 
    int getInt() { return 666; } 
}; 

#include <iostream> 

int main() { 
    boost::optional<A&> maybeAnA; 

    B b; 
    maybeAnA = b; // non owning, just the reference 

    boost::optional<A&> another(maybeAnA); 

    std::cout << another->getInt(); 
} 

인쇄

666 

당신이/할 경우를 통과 할 때와 완전히 동일 할 수 있습니다이 방법/~을 원해.이 유형의 컨테이너로 작동하려면 실제로 unique_ptr<A>을 사용해야합니다 (이미 nullable이며 양도가 가능하며 리소스를 소유하고 있음).

+0

나는'unique_ptr's을 조금 봤지만 주위로 이동하는 방법을 이해하지 못했습니다. 이제는 어떤 함수에 의해 반환 된'unique_ptr'을 일부 멤버로'std :: move' 할 수 있다는 것을 알았습니다. 어떻게 유용하게 사용되는지 알 수 있습니다. –

+0

_move-only_ 유형의 홀 마크입니다. 소유권을 이전해야하는 경우이를 사용하십시오. – sehe

0

원하는대로 할 수 없습니다.

선택 사항 (사용자의 경우) A 유형의 구성원을 만들려고 시도하지만 실패합니다.

내 마음에 오는 유일한 해결책은 (스마트 한) 포인터를 저장하는 것입니다.

관련 문제