Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化C+中类中的数组+;_C++_Arrays_Class_Int - Fatal编程技术网

C++ 初始化C+中类中的数组+;

C++ 初始化C+中类中的数组+;,c++,arrays,class,int,C++,Arrays,Class,Int,我正在为包含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};

我正在为包含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 stack[4];
然后我称之为:

int main(){
        HPStack* stack = new HPStack();
        cout << stack->peek() << endl;
        return 0;
}
intmain(){
HPStack*stack=新的HPStack();
看不见
这将创建一个本地堆栈变量-它不会修改您的成员堆栈变量。将其更改为:

std::fill(stack, stack+4, 0);
或者简单地说:

for (int i = 0; i < 4; ++i) 
    stack[i] = 0;
更新代码:

// 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];
}
//HPStack.h
类HPStack{
公众:
HPStack();
无效推力(intx);
int-pop();
int peek();
私人:
int堆栈[4];
};
//HPStack.cpp
HPStack::HPStack(){
对于(int i=0;i<4;++i)
堆栈[i]=0;
}
//推送/弹出功能
// ....
int HPStack::peek(){
返回堆栈[0];
}
这将创建一个本地堆栈变量-它不会修改您的成员堆栈变量。将其更改为:

std::fill(stack, stack+4, 0);
或者简单地说:

for (int i = 0; i < 4; ++i) 
    stack[i] = 0;
更新代码:

// 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];
}
//HPStack.h
类HPStack{
公众:
HPStack();
无效推力(intx);
int-pop();
int peek();
私人:
int堆栈[4];
};
//HPStack.cpp
HPStack::HPStack(){
对于(int i=0;i<4;++i)
堆栈[i]=0;
}
//推送/弹出功能
// ....
int HPStack::peek(){
返回堆栈[0];
}

在HPStack的构造函数中,您初始化了本地数组而不是成员数组,注意到了吗?

在HPStack的构造函数中,您初始化了本地数组而不是成员数组,注意到了吗

 int stack[4] = {0,0,0,0};
是一个局部变量,一旦构造函数返回,它就会超出作用域。
stack[]
作为成员变量与构造函数中存在的变量不同


是一个局部变量,一旦构造函数返回,它就超出范围。
stack[]
作为成员变量与构造函数中的成员变量不同。

我假设您将
int stack[4]
作为
HPStack
的成员变量。但是在构造函数中,您正在执行
int stack[4]={0,0,0};
,这里额外的
int
会产生一个新的局部变量
stack
,它隐藏了原始成员变量。因此,当您使用
peek
时,成员变量未初始化,您会得到一个垃圾值。您需要更正初始化代码,请查看可以填充已经用给定的值定义了数组。

我假设您有
int stack[4]
作为
HPStack
的成员变量。但是在构造函数中,您正在执行
int stack[4]={0,0,0,0};
,这里额外的
int
会产生一个新的局部变量
stack
,它隐藏了原始成员变量。因此,当您使用
peek
时,成员变量未初始化,您会得到一个垃圾值。您需要更正初始化代码,请查看可以填充已定义具有给定值的数组

HPStack::HPStack(){
        int stack[4] = {0,0,0,0};
}
此处,
stack
被声明为局部变量。如果您的类有一个名为
stack
的成员变量,则该变量未初始化,并且在构造函数中不可见,因为它已被隐藏

如果要将初始化的成员数组归零,可以通过在成员初始值设定项列表中为其指定一个显式空初始值设定项来对其进行值初始化

HPStack::HPStack() : stack()
{
}
编辑:这是一个非法的成员定义。如果您有数组成员,则必须为其指定非零大小:

private:
    int stack[];
此处,
stack
被声明为局部变量。如果您的类有一个名为
stack
的成员变量,则该变量未初始化,并且在构造函数中不可见,因为它已被隐藏

如果要将初始化的成员数组归零,可以通过在成员初始值设定项列表中为其指定一个显式空初始值设定项来对其进行值初始化

HPStack::HPStack() : stack()
{
}
编辑:这是一个非法的成员定义。如果您有数组成员,则必须为其指定非零大小:

private:
    int stack[];

在构造函数中,必须为数组动态分配内存

stack = new int[4];
也可以在类定义中创建静态数组

int stack[4];
PS:使用动态分配时,不要忘记释放析构函数中的内存:

delete[] stack;

在构造函数中,必须为数组动态分配内存

stack = new int[4];
也可以在类定义中创建静态数组

int stack[4];
PS:使用动态分配时,不要忘记释放析构函数中的内存:

delete[] stack;

当我用这个编译它时,我在构造函数“HPStack::HPStack()”中得到:HPStack.cpp::HPStack.cpp:8:错误:在“{”标记HPStack之前应该有一个主表达式。cpp:8:错误:应该是“;”在“{”标记之前你的代码意味着数组的第四个元素必须是{0,0,0,0};)这是我的错误,我一注意到它就纠正了它。当我用这个编译它时,我在构造函数“HPStack::HPStack()”:HPStack.cpp:8:error:expected primary expression在“{”标记HPStack.cpp:8:error:expected`;在“{”标记之前你的代码意味着数组的第四个元素必须是{0,0,0,0};)这是我的错误,我一发现就纠正了它。我以为规则是,malloc free,new-delete。我以为规则是,malloc free,new-delete。当ctor完成时,您在ctor中的local[]就死了,因此剩下的类int stack[]有垃圾。您的local[]在ctor中,当ctor完成时,ctor死亡,因此剩下的类int stack[]包含垃圾。