0

我在调用具有抽象类的左值的方法时遇到问题。类定义是:

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 循环)和 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);
}

根最初引用根,每次调用 MoveNext 时,都应将引用调整为下一个元素。

上面提到的代码不起作用,因为根无法分配,因为根的类型是抽象的。但是,如果我将 root 设为指针,则无法在 MoveNext 中更改该值。

我怎样才能解决这个问题?更改任何代码都可以,但想法应该保持不变。

4

3 回答 3

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 *&
于 2010-10-27T12:31:28.370 回答
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();
};
于 2010-10-27T12:39:27.977 回答
0

好的,首先。为什么 MoveNext 需要争论呢?它不应该。

virtual bool MoveNext() = 0;

进而

SimulatorSequenceItemBase& root = forSeq;
while(root.MoveNext())
{
   ++nI;
}
于 2010-10-27T12:34:10.167 回答