この質問は以前に回答された可能性がありますが、2日間検索した後、解決策を見つけることができませんでした。
以下を格納するスタッククラスを作成しました__data
:
class __data
{
private:
void* __p;
__datatype __type;
public:
__data(void);
__data(int i);
__data(double d);
__data(char* s);
__data(void (*f)(Stack));
bool IsFunction(void);
bool IsInteger(void);
bool IsNumber(void);
bool IsString(void);
void* Get(void);
};
このクラスを作成したのは、スタックが文字列、関数(関数へのポインター)、double、および整数を格納できるようになるためです。
問題は、整数または倍精度浮動小数点数をスタックにプッシュしてからポップし、データへのポインターを取得する場合です(void* Get(void)
)値を出力してデバッグしているため、基本的に次のようになります。
void print(Stack s)
{
__data d = s.Pop();
if (d.IsNumber()) // BUG: never the number I pass to __data
std::cout << "IsNumber - " << *((double*)d.Get()) << std::endl;
else if (d.IsInteger()) // BUG: it always prints out 1
std::cout << "IsInteger - " << *((int*)d.Get()) << std::endl; //
else if (d.IsString())
std::cout << "IsString - " << (char*)d.Get() << std::endl;
else if (d.IsFunction())
{
std::cout << "IsFunction - " << d.Get() << std::endl;
((void (*)(Stack))d.Get())(s); // calls the function
}
}
何が間違っているのかわかりません。おそらくそれが私が割り当てる方法__p
(によって返されるポインタGet()
)です。これらは__data
integerとdoubleのコンストラクタです。
__data::__data(int i)
{
__type = _dt_integer;
__p = &i;
}
__data::__data(double d)
{
__type = _dt_number;
__p = &d;
}
したがって、基本的に私の問題は、返された整数またはdoubleを取得しようとすると、 (integer)または(double)void*
の値が返されることです。1
2.13171e-314
お時間をいただきありがとうございます。これに対する答えがすでにある場合は申し訳ありません。
編集:
Stackクラスを書き直して、代わりに共用体を使用します。これが私の目標を達成するための最良の方法のようです。