对每个递归结构元素执行一些操作,而不在C ++中添加方法

时间:2014-08-31 09:23:43

标签: c++ recursion recurrence

任务:对每个递归结构元素执行操作,而不是在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;就像一个例子。

我找不到这样的解决方案,但我相信这里的某个人可以用一些疯狂的想法让我感到惊讶;)

2 个答案:

答案 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>

您需要一些描述对象结构的运行时元数据。