对象/指针向量的问题(实现复合设计模式)

时间:2009-08-25 11:22:17

标签: c++

我正在尝试实现单一实用的复合设计模式,我有一个抽象基类DocumentComponent,以及两个继承它的类,TextBody和Word。它应该代表一个可以包含额外句子和/或单词的句子。当我尝试实现具有addComponent和Print函数的TextBody类时,我的问题出现了。它们应该使用push_back向向量添加一个新的DocumentComponent对象,并分别调用向量中每个元素的print函数。我将我的对象存储在一个名为容器的DocumentComponent对象/指针的向量中,我一次只能得到其中一个(通过将我的向量更改为指针向量或对象向量)。如果我做前者我的打印功能工作,但不是我的addComponent功能,如果后者的情况相反。这是我的代码:

documentComponent.h:

class DocumentComponent
{   
    public:
        virtual void removeComponent(int index){}
        virtual void addComponent(DocumentComponent& comp){}
        virtual void print()=0;
};

textBody.h:

class TextBody : public DocumentComponent
{
    public:
        TextBody();
        virtual void addComponent(DocumentComponent& comp);
        virtual void print();
    private:
        vector<DocumentComponent*> container;
};

textBody.cpp:

void TextBody::addComponent(DocumentComponent& comp)
{
    container.push_back(&comp);
}

void TextBody::print()
{
    if (container.size() == 0)
        return;
    for_each(container.begin(), container.end(),mem_fun_ref(&DocumentComponent::print));
}

我收到错误消息

“无法初始化'DocumentComponent&amp;'在for_each函数中使用'DocumentComponent *'

我理解的是因为我想在引用时给它一个指针,但是将我的矢量改为对象矢量会导致

“无法创建抽象类的实例'DocumentComponent'”

在我的addComponent函数

4 个答案:

答案 0 :(得分:3)

当你说:

void TextBody::addComponent(DocumentComponent& comp)
{
    container.push_back(&comp);
}

是指动态分配的东西吗?如果没有,你可能会有问题,如果是,你应该只是传递一个指针。

答案 1 :(得分:3)

mem_fun_ref()调用引用对象上的成员,mem_fun()通过指针调用方法。

因此你需要像这样使用mem_fun():
textbody.cpp

void TextBody::print()
{
    if (container.size() == 0)
        return;
    for_each(container.begin(), container.end(),mem_fun(&DocumentComponent::print));
}

答案 2 :(得分:1)

您应该使用mem_fun()代替mem_fun_ref(),它将使用指针。

答案 3 :(得分:0)

感谢帮助人员,我最终使用了for循环,但在看到你的答案之后用mem_fun而不是mem_fun_ref将其改回了for_each,就像魅力一样