我正在尝试实现单一实用的复合设计模式,我有一个抽象基类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函数
中答案 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,就像魅力一样