我正在为一个包含4个元素的堆栈编写一个类。定义如下:
// HPStack.h
class HPStack{
public:
HPStack();
void push(int x);
int pop();
int peek();
private:
int stack[];
};
// HPStack.cpp
HPStack::HPStack(){
int stack[4] = {0,0,0,0};
}
// push/pop functions
// ....
int HPStack::peek(){
return stack[0];
}
然后我称之为:
int main(){
HPStack* stack = new HPStack();
cout << stack->peek() << endl;
return 0;
}
但是当我运行main
函数(用g ++编译)时,它输出:137048
当我真正想要它打印时0.这里发生了什么,我该怎么做才能修复问题
答案 0 :(得分:5)
HPStack::HPStack(){
int stack[4] = {0,0,0,0};
}
这里,stack
被声明为局部变量。如果您的类有一个也称为stack
的成员变量,那么它不会被初始化并且在构造函数中不可见,因为它已被隐藏。
如果要对成员数组进行零初始化,可以通过在成员初始值设定项列表中为其提供显式空初始值设定项来值初始化。
HPStack::HPStack() : stack()
{
}
编辑:这是非法的成员定义。如果你有一个数组成员,你必须给它一个非零大小:
private:
int stack[];
答案 1 :(得分:1)
int stack[4] = {0,0,0,0};
是一个局部变量,一旦构造函数返回就超出范围。 stack[]
作为成员变量与构造函数中的变量不同。
答案 2 :(得分:0)
int stack[4] = {0,0,0,0};
这会创建一个本地堆栈变量 - 它不会修改成员堆栈变量。将其更改为:
std::fill(stack, stack+4, 0);
或者简单地说:
for (int i = 0; i < 4; ++i)
stack[i] = 0;
此外,您的stack
成员变量应声明如下:
int stack[4];
更新的代码:
// HPStack.h
class HPStack{
public:
HPStack();
void push(int x);
int pop();
int peek();
private:
int stack[4];
};
// HPStack.cpp
HPStack::HPStack(){
for (int i = 0; i < 4; ++i)
stack[i] = 0;
}
// push/pop functions
// ....
int HPStack::peek(){
return stack[0];
}
答案 3 :(得分:0)
在HPStack的构造函数中,你初始化了本地数组而不是成员数组,你注意到了吗?
答案 4 :(得分:0)
我假设你有int stack[4]
作为HPStack
的成员变量。但是在构造函数中,您正在执行int stack[4] = {0,0,0,0};
,此处额外的int
会生成一个新的 local 变量stack
,它隐藏了原始成员变量。因此,当您使用peek
时,成员变量未初始化并且您获得垃圾值。您需要更正初始化代码,查看std::fill
方法,该方法可以使用给定值填充已定义的数组。
答案 5 :(得分:0)
在构造函数中,您必须为数组动态分配内存。
stack = new int[4];
或者您可以在类定义中创建静态数组
int stack[4];
PS:当你使用动态分配时,不要忘记在析构函数中释放内存:
delete[] stack;