У нас есть базовый класс .....станд :: shared_ptr Class Factory C++
class Node
{
public:
std::string Name;
Node(){};
~Node(){};
}
фильтр является производным классом узла. Фильтр - это тот же узел, за исключением того, что он имеет свойство «filterId», и его конструктор заполняет Узел .Name = 'Filter'.
class Filter: public Node
{
public:
int filterId;
Filter() : Node()
{
Name="Filter";
}
}
У меня есть ClassFactory, который возвращает std::shared_ptr<Node>
при передаче строки
Пожалуйста, найти код для этого завода по CodeProject следующей ссылке.
http://www.codeproject.com/Articles/567242/AplusC-b-bplusObjectplusFactory.
код кажется инстанцировать фильтр, но возвращает узел. т.е. нарезка объектов.
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 (Node), который фактически может содержать зЬй :: 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'.
Что я здесь делаю неправильно? Узел является базовым классом для всех моих производных классов. Когда у меня есть функция, которая принимает Узел, я должен быть в состоянии отправить его Фильтр и иметь доступ к фильтру.
Указатели рекомендуются для помощи в подобных ситуациях, однако shared_ptr является заостренным, поскольку все будет в порядке.
boost имеют shared_dynamic_cast – thomas