使用l值和抽象类

时间:2010-10-27 12:24:37

标签: c++ lvalue

我遇到了使用抽象类的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中更改该值。

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

3 个答案:

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