我正在用c ++制作玩具编程语言,但我遇到了一个问题。我注意到在c ++中,堆栈只能存储一种类型的数据。我想知道是否有一种简单的方法来解决这个问题,例如通过在堆栈中存储每个对象的字节数组。我想知道是否有人知道jvm是如何克服这个问题的。我需要存储在堆栈上的类型是char,short,int,float,double,strings,arrays和对象的引用。我知道jvm堆栈可能更像是一个抽象,但如果它是我仍然想知道他们是如何完成它的。如果它有任何区别,我只计划针对Windows计算机。
答案 0 :(得分: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$
答案 1 :(得分: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));
答案 2 :(得分:0)
只是一个猜测,但jvm可能将所有内容视为一个对象,因此堆栈只是一个对象的集合。
如果您创建基础数据对象类并从中派生所有支持的数据类型,也可以这样做。