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()resetrootを使用するには、参照ごとにポインターを取得する必要があります。

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 に答える