编写堆栈实现c ++时遇到问题

时间:2013-10-22 23:50:04

标签: c++ casting stack

我正在构建一个编程语言解释器,我目前正在编写堆栈代码。现在写入堆栈将只保存字节值,但它也将扩展为保存其他字节。目前我无法在所有堆栈对象扩展的'BaseObject'和我的jbyte类之间进行转换。这是我目前的测试代码。

#include "stdafx.h"
#include <string>
#include <stack>
#include <iostream>
#include <Windows.h>
#include <stack>

using namespace std;

class BaseObject
{
public:
    virtual string getIdentifier(){return "Not Implemented";}
};

class Stack
{
    class jbyte : public BaseObject
    {
    private:
        INT8 byteValue;

    public: 
        jbyte(INT8 value)
        {
            byteValue = value;
        }

        INT8 getValue()
        {
            return byteValue;
        }
    };

private:
    stack<BaseObject> objectStack;

public:
    void pushByte(INT8 byteValue)
    {
        jbyte toPush(byteValue);
        objectStack.push(toPush);
    }

    INT8 popByte()
    {
        if(objectStack.size() == 0)
        {
            cout<<"ERROR: Trying To Pop Value From Empty Stack\nPress Any Key To Continue...";
            _gettch();
            exit(1);
        }
        else
        {
            BaseObject& bo = objectStack.top();
            jbyte& b = dynamic_cast<jbyte&>(bo);
        }
    }
};

int main()
{
    Stack stack;
    stack.pushByte(9);
    stack.popByte();
    while(true);
}

当我尝试运行它时,我在StackTests.exe中得到Unhandled exception at at 0x75C4C41F:Microsoft C ++异常:std :: bad_cast在内存位置0x0034F858。

我想知道如何解决这个问题,或者如果这很困难,我怎样才能重写堆栈才能成功运行。

1 个答案:

答案 0 :(得分:0)

当您objectStack.push(toPush)时,jbyte的{​​{1}}部分被切掉,只剩下toPush部分。这就是为什么不再可能将BaseObject转回BaseObject