2013-10-21 202 views
0

我正在C++中製作玩具編程語言,但我遇到了一個問題。我注意到,在C++中,堆棧只能存儲一種類型的數據。我想知道是否有一個簡單的方法來解決這個問題,比如通過在堆棧中存儲每個對象的字節數組。我想知道是否有人知道jvm如何克服這個問題。我需要在棧上存儲的類型是char,short,int,float,double,strings,數組和對象的引用。我知道jvm堆棧可能更像是一種抽象,但如果是這樣的話,我仍然想知道它們是如何實現它的。如果它有什麼區別,我只打算瞄準Windows電腦。使用堆棧實現C++

+3

C++可以用'std :: stack >'來做到這一點。 – chris

+2

通常,在大多數語言中,這是通過存儲更多的數據而不僅僅是數據本身來解決的。諸如堆棧上的「類型標識」(例如枚舉)。 –

+0

我如何使用視覺工作室快速增強 – Popgalop

回答

3

你知道C++支持繼承和多態,對吧?一種遠更簡單的方法做,這是從一個共同的基類派生的所有您的令牌,並Base *物品堆,比如:

#include <iostream> 
#include <string> 
#include <stack> 
#include <memory> 

class base { 
    public: 
     virtual void print_token() = 0; 
     virtual ~base() {} 
}; 

class token_a : public base { 
    public: 
     token_a(int n) : n(n) {} 
     virtual void print_token() { std::cout << n << std::endl; } 

    private: 
     int n; 
}; 

class token_b : public base { 
    public: 
     token_b(std::string s) : s(s) {} 
     virtual void print_token() { std::cout << s << std::endl; } 

    private: 
     std::string s; 
}; 

int main(void) { 
    std::stack<std::shared_ptr<base> > my_stack; 
    my_stack.push(std::shared_ptr<base>(new token_a(5))); 
    my_stack.push(std::shared_ptr<base>(new token_b("a word"))); 

    for (int i = 0; i < 2; ++i) { 
     std::shared_ptr<base> pb = my_stack.top(); 
     pb->print_token(); 
     my_stack.pop(); 
    } 

    return 0; 
} 

輸出:

[email protected]:~/src/cpp/scratch$ ./stack 
a word 
5 
[email protected]:~/src/cpp/scratch$ 
2

我已經解決了這個問題(在C,對於口齒不清interpretr,大約25年前,但同樣的想法適用於今天)的方法是有一個struct與類型和union裏面:

struct Data // or class 
{ 
    enum kind { floatkind, intkind, stringkind, refkind }; 
    Kind kind; 
    union 
    { 
     double f; 
     int i; 
     std::string s; 
     Data* r;  // reference, can't use Data &r without heavy trickery. 
    } u; 

    Data(double d) { kind = floatkind; u.f = d; } 
    Data(int i) { kind = intkind; u.i = i; } 
    ... 
} 

std::stack<Data> st; 

st.push(Data(42)); 
st.push(Data(3.14)); 
0

只是一個猜測,但是jvm可能會將所有對象視爲對象,所以堆棧僅僅是對象的集合。

如果您創建基礎數據對象類並從中派生所有受支持的數據類型,則可以這樣做。