任务:对每个递归结构元素执行操作,而不是在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
的私有/受保护成员/方法 - 我不能认为它会是只有一个&#34; sth&#34;就像一个例子。
我找不到这样的解决方案,但我相信这里的某个人可以用一些疯狂的想法让我感到惊讶;)
答案 0 :(得分:1)
回答评论:@firda你能解释一下吗?我不确定你是什么意思。
我的评论是:为什么不在Presenter上使用它(recursivePresent帮助程序)?
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 :(得分:0)
在运行时,C ++ struct
(或class
)对象不知道其结构,字段,布局或大小。这些只在编译时才知道。
如果在long newfield;
的末尾添加新字段struct Component
,代码中的大多数例程将保持不变(分配此类结构的那些例程除外,它们正在使用其大小)。< / p>
您需要一些描述对象结构的运行时元数据。