우리는 기본 클래스가 .....표준 : : shared_ptr의 클래스 공장 C++
class Node
{
public:
std::string Name;
Node(){};
~Node(){};
}
필터는 노드의 파생 클래스입니다. 필터은 'filterId'속성을 가지고 있으며 생성자가 노드 .Name = 'Filter'로 채워지는 것을 제외하고는 동일한 노드입니다.
class Filter: public Node
{
public:
int filterId;
Filter() : Node()
{
Name="Filter";
}
}
나는 문자열
이 링크를 CodeProject의 해당 공장에 코드를 찾아주세요을 통과 할 때 std::shared_ptr<Node>
을 반환하는 ClassFactory 있습니다.
http://www.codeproject.com/Articles/567242/AplusC-b-bplusObjectplusFactory.
코드가 필터을 인스턴스화하는 것으로 보이지만, 노드을 반환합니다. 즉 Object slicing.
std::shared_ptr<Node> n = std::make_shared(Node); // As expected, doesn't not have filter ID and node.Name is blank.
std::shared_ptr<Filter> f = std::make_shared(Filter); // As expected, has filterID and node.Name is 'Filter'.
지금 내가 실제로 클래스 공장에서 요청 내용에 따라 표준 : : shared_ptr의 (필터)를 포함 할 수있다 표준 : : shared_ptr의 (노드)의 배열을 처리합니다.
std::shared_ptr<Node> nf = std::make_shared(Filter); // Error. Does not have filterId, but does have **Node**.Name='Filter'.
나는 더 간단한 경우를 시도해 보았습니다. ..... 그리고 같은 문제가 있습니다.
Node n = Node();
Filter f = Filter();
Node nf =Filter(); // Error, nf does not have a filterID, but it's Name field is set to 'Filter'.
여기서 내가 뭘 잘못하고 있니? 노드은 모든 파생 클래스의 기본 클래스입니다. 노드을 수락하는 함수가있을 경우 필터을 보내고 filterId를 사용할 수 있어야합니다.
포인터는 이러한 상황에서 도움이 될 것을 권장하지만, shared_ptr은 사물이 얻는 것처럼 뾰족하다.
부스트가 있습니다 shared_dynamic_cast – thomas