在书中"思考C ++"有一个练习问题,要求创建一个包含双精度的堆栈,并填充25个双精度值,然后将它们打印到控制台。我对此问题的代码如下:
Stack.h
//Stack.h
struct Stack {
struct Link {
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
}* head;
void init();
void push(void* element);
void* pop();
void cleanup();
};
StackLib.cpp
#include "Stack.h"
#include <iostream>
using namespace std;
void Stack::init()
{
head = 0;
}
void Stack::Link::initialize(void* dat, Link* nxt)
{
data = dat;
next = nxt;
}
void Stack::push(void* element)
{
Link* newLink = new Link;
newLink->initialize(element, head);
head = newLink;
}
void* Stack::pop()
{
if (head == 0) return 0;
void* vp = head->data;
Link* oldhead = head;
head = head->next;
delete oldhead;
return vp;
}
void Stack::cleanup()
{
cout << "Clean up the Stack!" << endl;
Link* tmpLink;
while(head != 0){
tmpLink = head->next;
delete head;
head = tmpLink;
}
}
Test.cpp的
#include "Stack.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
Stack dbStack;
dbStack.init();
int i;
double d;
for(i = 0; i < 25; i++){
d = i/10.0;
dbStack.push(&d);
}
for(i = 0; i < 25; i++)
cout << *(double *)dbStack.pop() << endl;
}
执行程序时,输出为
2.4
2.4
2.4
2.4
(output omitted)
所有这些都是2.4,这不是我所期待的!那么我的代码有什么问题呢?
答案 0 :(得分:3)
乍一看,问题可能就在这一行:
dbStack.push(&d);
您正在通过它的引用推送值,这意味着堆栈中的所有值都将与变量d
答案 1 :(得分:-3)
这不是您正在寻找的答案,但正如评论者所说:
逐步执行您的代码。
那就是我要为你做的事情,然后我记得:教一个人钓鱼......
如果你没有使用IDE(但你应该),你可以添加print语句,以便在程序进行时显示变量的变化值。