我遇到了使用抽象类的l值调用方法的问题。类定义是:
class SimulatorSequenceItemBase {
public:
SimulatorSequenceItemBase();
virtual ~SimulatorSequenceItemBase();
virtual uint32_t GetResult(uint32_t p_nSite) = 0;
virtual bool MoveNext(SimulatorSequenceItemBase& p_rNext) = 0;
}
SimulatorSequenceItemBase有多个子类。在for循环中有序列(for循环)和项目。
我想循环遍历序列并使用以下步骤计算步骤:
uint32_t nI = 0;
SimulatorSequenceItemBase root = forSeq; // forSeq is an instance of a subclass of SimulatorSequenceItemBase
while(root.MoveNext(root))
{
++nI;
std::cout << root.GetResult(0);
}
root初始引用root,每次调用MoveNext时,都应该将引用调整为下一个元素。
上面提到的代码不起作用,因为root不能分配,因为root的类型是抽象的。但是,如果我将root设为指针,则无法在MoveNext中更改该值。
我该如何解决这个问题?改变任何代码都可以,但这个想法应该保持不变。
答案 0 :(得分:2)
我不知道forSeq
应该是什么,但
SimulatorSequenceItemBase& root = forSeq; // note that &
根据评论,你需要重置root
来引用不同的对象,你必须使用指针:
SimulatorSequenceItemBase* root = forSeq; note the *
while(root.MoveNext(root))
{
// ...
}
但是,为了让MoveNext()
重置root
,必须为每个引用添加指针:
bool MoveNext(SimulatorSequenceItemBase*& p_rNext) // note the *&
答案 1 :(得分:1)
您遇到问题的原因是因为行SimulatorSequenceItemBase root = forSeq;
实际上是在堆栈上创建SimulatorSequenceItemBase
的新实例(forSeq
的拼接副本)。因为您具有纯虚函数,所以无法创建基类的实例。您需要做的是将其更改为使用引用或指针:
SimulatorSequenceItemBase *pRoot = &forSeq;
while (pRoot->MoveNext(pRoot))
{
++nI;
std::cout << pRoot->GetResult(0);
}
修改在发表评论后,我建议您重构代码:
SimulatorSequenceItemBase *pNode = &forSeq;
while (pNode != NULL)
{
++nI;
std::cout << pRoot->GetResult(0);
pNode = pNode->MoveNext();
};
答案 2 :(得分:0)
好的,首先。为什么MoveNext会参与争论呢?它不应该。
virtual bool MoveNext() = 0;
然后
SimulatorSequenceItemBase& root = forSeq;
while(root.MoveNext())
{
++nI;
}