recursion — выполнить некоторые операции с каждым элементом рекурсивной структуры, не добавляя к нему методы в переполнении стека.

Задание: выполнить операцию над каждым элементом рекурсивной структуры, не изменяя его (структура имеет только элементы и никаких методов, кроме конструктора) внутри 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) все IDcontent такие пары, как:

A a content sth
B b content sth
C1 c1 content sth
C2 c2 content sth

Это может быть легко достигнуто путем добавления некоторых recursivePresent(std::string &output) метод для Component состав.

Но я хочу знать, если это можно сделать без изменения Component состав (без добавления какого-либо метода)?

РЕДАКТИРОВАТЬ (сделано из-за комментариев): обратите внимание, что вывод использует некоторые Presenterчастные / защищенные члены / методы — я не могу предположить, что это будет просто один «sth», как в примере.

Я не могу найти такое решение, но я верю, что кто-то здесь может удивить меня какой-нибудь сумасшедшей идеей;)

0

Решение

Ответ на комментарий: @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);
}
};
1

Другие решения

Во время выполнения C ++ struct (или же class) объект не знает своей структуры, полей, макета или размера. Они известны только во время компиляции.

Если вы добавите новое поле long newfield; в конце вашего struct Componentбольшинство подпрограмм в вашем коде останутся прежними (за исключением тех, которые выделяют такую ​​структуру, они используют ее размер).

Вы должны иметь некоторые метаданные времени выполнения, описывающие структуру вашего объекта.

0

По вопросам рекламы [email protected]