Задание: выполнить операцию над каждым элементом рекурсивной структуры, не изменяя его (структура имеет только элементы и никаких методов, кроме конструктора) внутри Presenter::present(...)
метод (который использует частные члены Presenter
).
Эта проблема: структура НЕ имеет никаких методов, кроме конструктора.
Пример:
У меня есть структура:
struct Component{
std::vector<Component *> children;
Component * parent;
std::string ID;
std::string content;
Component(ID, content){...}
};
Тогда у меня есть код вроде:
Component * a, * b, * c1, * c2;
a = new Component("A", "a content");
b = new Component("B", "b content");
c1 = new Component("C1", "c1 content");
c2 = new Component("C2", "c2 content");
b->parent = a;
a->children.push_back(b);
c1->parent = b;
c2->parent = b;
b->children.push_back(c1);
b->children.push_back(c2);
Я сейчас хочу, имея a
указатель передан моему Presenter::present(...)
:
class Presenter{
private:
std::string somethingImportant; // = "sth";
...
public:
std::string present(Component * a){
... //on each component's children (and component itself):
//get ID and content then add something from this (Presenter)
//or modify the ID/content a bit.
//At the end, return the result (for all components together).
}
...
}
Выход на std::string
(или консоль, nvm) все ID
—content
такие пары, как:
A a content sth
B b content sth
C1 c1 content sth
C2 c2 content sth
Это может быть легко достигнуто путем добавления некоторых recursivePresent(std::string &output)
метод для Component
состав.
Но я хочу знать, если это можно сделать без изменения Component
состав (без добавления какого-либо метода)?
РЕДАКТИРОВАТЬ (сделано из-за комментариев): обратите внимание, что вывод использует некоторые Presenter
частные / защищенные члены / методы — я не могу предположить, что это будет просто один «sth», как в примере.
Я не могу найти такое решение, но я верю, что кто-то здесь может удивить меня какой-нибудь сумасшедшей идеей;)
Ответ на комментарий: @firda Вы можете это немного объяснить? Я не уверен, что ты имеешь в виду.
Мой комментарий был: Почему бы не иметь его (помощник recursivePresent) на Presenter?
class Presenter {
void presentRecursive(Component *c, std::ostream& out) {
out << c->ID << ' ' << c->content << std::endl;
for(auto p : c->children) presentRecursive(p, out);
}
public:
void present(Component *c) {
presentRecursive(c, std::cout);
}
};
Во время выполнения C ++ struct
(или же class
) объект не знает своей структуры, полей, макета или размера. Они известны только во время компиляции.
Если вы добавите новое поле long newfield;
в конце вашего struct Component
большинство подпрограмм в вашем коде останутся прежними (за исключением тех, которые выделяют такую структуру, они используют ее размер).
Вы должны иметь некоторые метаданные времени выполнения, описывающие структуру вашего объекта.