0

我正在用 C++ 制作一种玩具编程语言,但我遇到了问题。我注意到在 C++ 中,堆栈只能存储一种类型的数据。我想知道是否有一种简单的方法可以解决这个问题,例如在堆栈中存储每个对象的字节数组。我想知道是否有人知道 jvm 如何克服这个问题。我需要存储在堆栈上的类型是 char、short、int、float、double、字符串、数组和对对象的引用。我知道 jvm 堆栈可能更像是一种抽象,但如果是的话,我仍然想知道他们是如何完成它的。如果有什么不同,我只打算针对 Windows 计算机。

4

3 回答 3

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;
}

输出:

paul@local:~/src/cpp/scratch$ ./stack
a word
5
paul@local:~/src/cpp/scratch$
于 2013-10-21T23:34:58.580 回答
2

我解决这个问题的方法(在 C 语言中,对于一个 lisp 解释器,大约 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));
于 2013-10-21T23:30:48.750 回答
0

只是一个猜测,但 jvm 可能将所有内容都视为对象,因此堆栈只是对象的集合。

如果您创建一个基础数据对象类并从中派生所有受支持的数据类型,您也可以这样做。

于 2013-10-21T23:35:14.333 回答