C++ でおもちゃのプログラミング言語を作成していますが、問題が発生しました。C++ では、スタックは 1 種類のデータしか格納できないことに気付きました。各オブジェクトのバイト配列をスタックに格納するなど、この問題を解決する簡単な方法があるかどうか疑問に思っていました。jvmがこの問題をどのように克服するかを誰かが知っているかどうか疑問に思っていました。スタックに格納する必要がある型は、char、short、int、float、double、string、array、およびオブジェクトへの参照です。jvmスタックが抽象化されている可能性があることは理解していますが、そうである場合でも、彼らがどのようにそれを達成したかを知りたい. 違いがある場合は、Windows コンピューターのみをターゲットにする予定です。
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
中に a を持つことです:
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 に答える