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

使用堆栈实现C++; 我在C++中制作了一个玩具编程语言,但我遇到了一个问题。我注意到,在C++中,堆栈只能存储一种类型的数据。我想知道是否有一种简单的方法来解决这个问题,比如在堆栈中存储每个对象的字节数组。我想知道是否有人知道jvm是如何克服这个问题的。我需要存储在堆栈上的类型有char、short、int、float、double、string、数组和对对象的引用。我知道jvm堆栈可能更像是一种抽象,但如果是,我仍然想知道他们是如何完成的。如果有什么不同的话,我只打算针对windows计算机。,c++,stack,C++,Stack,我解决这个问题的方法(对于一个lisp解释器来说,在C语言中,大约25年前,但今天同样的想法也适用)是在其内部有一个带有类型和联合的struct: struct Data // or class { enum kind { floatkind, intkind, stringkind, refkind }; Kind kind; union { double f; int i; std::string s;

我解决这个问题的方法(对于一个lisp解释器来说,在C语言中,大约25年前,但今天同样的想法也适用)是在其内部有一个带有类型和联合的
struct

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));
结构数据//或类 { 枚举种类{floatkind,intkind,stringkind,refkind}; 善良; 联盟 { 双f; int i; std::字符串s; Data*r;//引用,如果没有严重的欺骗,就不能使用Data&r。 }u; 数据(双d){kind=floatkind;u.f=d;} 数据(inti){kind=intkind;u.i=i;} ... } std::stack st; st.push(数据(42)); st.push(数据(3.14));
我解决这个问题的方法(在C语言中,对于一个lisp解释器来说,大约25年前,但今天同样的想法适用)是使用一个
结构,其中包含一个类型和一个
并集

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));
结构数据//或类 { 枚举种类{floatkind,intkind,stringkind,refkind}; 善良; 联盟 { 双f; int i; std::字符串s; Data*r;//引用,如果没有严重的欺骗,就不能使用Data&r。 }u; 数据(双d){kind=floatkind;u.f=d;} 数据(inti){kind=intkind;u.i=i;} ... } std::stack st; st.push(数据(42)); st.push(数据(3.14));
<>代码> 你知道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;
}

<>你知道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;
}

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


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

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


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

C++可以通过
std::stack
来实现这一点。通常,在大多数语言中,这是通过存储数据本身以外的内容来解决的。例如,在STACK上的“类型标识”(例如枚举)。如何使用VisualStudio ExpStudio使用Booost,我将存储更多的数据本身,因为我不能在C++中创建一个通用对象,特别是,我如何存储不同维度数组,SuCc++可以用<代码> STD::Stuts来完成。解决这个问题的方法不仅仅是存储数据本身。比如在STACK上的“类型标识”(例如,枚举)。如何使用VisualStudio ExpStudio使用Booost,我将存储更多的数据本身,因为我不能在C++中创建一个通用对象,特别是,我将如何存储不同的维度数组等等。