2013-10-22 40 views
0

我正在构建一个编程语言解释器,并且我正在编写堆栈代码。现在写入堆栈将只保存字节值,但它将被扩展以保存其他字节。目前,我在'BaseObject'和所有堆栈对象之间进行转换时遇到了问题,并且我的jbyte类也出现了问题。这是我目前的测试代码。在编写堆栈实现时遇到困难C++

#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:微软C++异常:的std :: bad_cast内存位置0x0034F858。

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

+7

std :: stack st;'完成。还有一个有趣的机制,用于在main()'末尾“暂停”。也就是说,你需要更好地理解'dynamic_cast'的作用。 – WhozCraig

+0

但这只能保存字节,如果我想能够在堆栈上存储int,那该怎么办 – Popgalop

+1

所以你想持有一个对象*和*一个附加的字节?那是对的吗? (如果是的话,你知道切片是什么东西)吗? – WhozCraig

回答

0

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