代码之家  ›  专栏  ›  技术社区  ›  astellin

对抽象类使用l值

  •  0
  • astellin  · 技术社区  · 16 年前

    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);
    }
    

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

    我该怎么解决?更改任何代码都可以,但想法应该保持不变。

    3 回复  |  直到 16 年前
        1
  •  2
  •   sbi    16 年前

    我不知道 forSeq 本来应该是,但怎么了

    SimulatorSequenceItemBase& root = forSeq; // note that &
    

    root 要引用不同的对象,必须使用指针:

    SimulatorSequenceItemBase* root = forSeq; note the *
    while(root.MoveNext(root))
    {
        // ...
    }
    

    但是,为了 MoveNext() 重置 ,它必须为每个引用获取指针:

    bool MoveNext(SimulatorSequenceItemBase*& p_rNext) // note the *&
    
        2
  •  1
  •   Mark Ingram    16 年前

    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();
    };
    
        3
  •  0
  •   Armen Tsirunyan    16 年前

    virtual bool MoveNext() = 0;
    

    然后

    SimulatorSequenceItemBase& root = forSeq;
    while(root.MoveNext())
    {
       ++nI;
    }
    
    推荐文章