Я реализовал составной шаблон с помощью интеллектуальных указателей, он работает до точки.Композитный с умными указателями без dynamic_pointer_cast
Проблема в том, что я просто могу использовать методы, реализованные в интерфейсе, и я не могу использовать методы, которые определены в производном классе, не используя dynamic_pointer_cast
, и я не хочу этого.
Я хочу знать, можно ли это сделать без использования dynamic_pointer_cast
.
Я слышал, что мне нужно реализовать шаблон посетителя, но я действительно не знаю, как это сделать, и если он подходит к этой проблеме.
#include <iostream>
#include <vector>
#include <memory>
class Fruit
{
public:
virtual void getOld() = 0;
};
class Orange : Fruit
{
public:
Orange() {}
void add(std::shared_ptr<Fruit> f)
{
v.push_back(f);
}
std::shared_ptr<Fruit> get(int k)
{
return v[k];
}
void getOld()
{
std::cout << "Orange - I'm old." << std::endl;
}
private:
std::vector<std::shared_ptr<Fruit>> v;
};
class Bitter : public Fruit
{
public:
Bitter() {}
void getOld()
{
std::cout << "Bitter - I'm old." << std::endl;
}
void getNew()
{
std::cout << "Bitter - I'm new." << std::endl;
}
};
int main(int argc, char ** argv)
{
auto orange = new Orange;
orange->add(std::make_shared<Bitter>());
auto bitter = orange->get(0);
bitter->getOld();
return 0;
}
Он работает, как вы можете видеть здесь, на live preview, но когда я пытаюсь использовать:
int main(int argc, char ** argv)
{
auto orange = new Orange;
orange->add(std::make_shared<Bitter>());
auto bitter = orange->get(0);
bitter->getOld();
bitter->getNew();
return 0;
}
Я получил ошибку:
error: 'class Fruit' has no member named 'getNew'
Спасибо заранее.
Я знаю это, но что произойдет, если у меня есть десятки классов с разными методами? Интерфейс будет беспорядок с множеством методов, не так ли? - Подождем, чтобы посмотреть, есть ли у кого-то решение или, по крайней мере, способ сделать это лучше. Благодарю. –
Проблема может быть в вашем дизайне. Если вы знаете, какой тип Orange вернется, вы можете делать такие функции, как «getBitter», а не просто «get» – meneldal
Снова та же проблема, что произойдет, если у меня есть десятки классов? Мне нужно будет создавать методы для каждого из них. Если мы посмотрим на сторону реализации, мы сможем это сделать, но как насчет API? –