0

私のコードには、次のような「schemeList」と呼ばれるオブジェクトがあります。

class scheme;
class schemeList
{
    friend class scheme;
private:

    scheme * head;
    schemeList * tail;

public:
    schemeList();
    Token addScheme(vector <Token> &toAdd);
    //...other functions
};

私が問題を抱えている関数は「addScheme」です。これはスキームを頭に追加するか、頭がいっぱいの場合は尾に追加することになっています(リンクリストのような方法で)。これが私がこれまで持っている機能です:

Token schemeList::addScheme(vector<Token>& toAdd)
{
    if (head->retCloseParen() != ')')
    {
        scheme * headCopy = head;       
        Token answer = head->addScheme(toAdd);
        head = headCopy;
        return  answer;
    }
    else
    {
        //deal with tail
        schemeList * arrow = this;

        while (arrow->tail != NULL)
        {
            arrow = arrow->tail;
        }

        tail = new schemeList();

        tail->head= new scheme();
        tail->tail = NULL;

        Token answer = arrow->tail->addScheme(toAdd);
        return answer;
    }
}

これは、最初のスキームを追加する場合には問題なく機能しますが、2 番目のスキームでは「未処理の例外...」というエラーがスローされます。以前にこのような問題がありましたが、toAddオブジェクト全体を渡すのではなく、参照によって変数を渡すことで修正しました。これがエラーをスローするのはなぜですか、またはどのように修正すればよいですか?

物事をより明確にする場合、スキームは次のとおりです。

class scheme
{
    friend class identifierList;

public:
    Token * id;
    char openParen;
    char closeParen;
    identifierList * idList;

    scheme();
    //other functions
};

class identifierList
{
    friend class scheme;
public:
    Token * id;
    identifierList * next;

    identifierList(Token * inId, identifierList * inNext);
};

トークンは次のとおりです。

class Token
{
    friend class datalogProgram;

public:
    int lineNumber;
    string type;
    string value;

    Token(string inType, string inValue, int inLineNum);
    //other functions
};
4

1 に答える 1

0
  • 十分な詳細、特に例外を引き起こしているコードが提供されていません。コール スタックを調べた方がよいでしょう。
  • head、およびその他のポインター変数を初期化NULLしていますか - それを行うコンストラクターはありません。チェックもありません(head->retCloseParen() != ')'チェックのみ)。
  • Thomas がコメントで示唆しているように、すでに利用可能なコンテナ クラスのいくつかを使用することをお勧めします。
于 2013-03-31T18:09:44.480 に答える