c++ - 如何在构造函数中初始化struct的动态数组?
问题描述
这是一个基于深度优先搜索 (DFS) 的动态结构数组的 Stack 类。程序在遇到函数push()时无法运行,说明在构造函数中数组没有成功初始化。
我试图寻找错误,甚至将 struct 的动态数组更改为并行数组,但它仍然不起作用。如果问题似乎太简单而无法解决,我深表歉意,因为我没有扎实的 C++ 基础。
#include <iostream>
#include <iomanip>
#ifndef HEADER_H
#define HEADER_H
using namespace std;
struct Value
{
int row; // row number of position
int col; // column number of position
//operator int() const { return row; }
};
class ArrayStack
{
public:
int top;
Value* array;
ArrayStack();
bool isEmpty();
bool isFull();
void push(int r, int c);
void pop();
int poprowvalue(int value);
int popcolvalue(int value);
int peekrow(int pos);
int peekcol(int pos);
int count();
void change(int pos, int value1, int value2);
void display();
void resize();
private:
int size;
};
ArrayStack::ArrayStack()
{
//Initialize all variablies
top = -1;
size = 10;
Value * array = new Value[size];
for (int i = 0; i < size; i++)
{
array[i].row = 0;
array[i].col = 0;
}
}
bool ArrayStack::isEmpty()
{
if (top == -1)
return true;
else
return false;
}
bool ArrayStack::isFull()
{
if (top == size - 1)
return true;
else
return false;
}
void ArrayStack::resize()
{
if (isFull())
size *= 2;
else if (top == size / 4)
size /= 2;
}
void ArrayStack::push(int r, int c)
{
if (isEmpty() == false)
resize();
array[top + 1].row = r;
array[top + 1].col = c;
top++;
}
void ArrayStack::pop()
{
int value;
if (isEmpty())
{
cout << "Stack underflow" << endl;
}
else
{
poprowvalue(array[top].row);
popcolvalue(array[top].col);
array[top].row = 0;
array[top].col = 0;
top--;
}
}
int ArrayStack::poprowvalue(int v)
{
return v;
}
int ArrayStack::popcolvalue(int v)
{
return v;
}
int ArrayStack::peekrow(int pos)
{
if (isEmpty())
cout << "Stack underflow" << endl;
else
return array[pos].row;
}
int ArrayStack::peekcol(int pos)
{
if (isEmpty())
cout << "Stack underflow" << endl;
else
return array[pos].col;
}
int ArrayStack::count()
{
return (top + 1);
}
void ArrayStack::change(int pos, int value1, int value2)
{
if (isEmpty())
cout << "Stack underflow" << endl;
else
{
array[pos].row = value1;
array[pos].col = value2;
}
}
void ArrayStack::display()
{
for (int i = size - 1; i > -1; i--)
{
cout << array[i].row << " " << array[i].col << endl;
}
}
#endif
我希望它运行良好,但第 80 行总是抛出异常,如下所示:
Exception thrown at 0x00007FF6A160487C in Assignment1.exe: 0xC0000005: Access violation writing location 0x0000000000000000.
解决方案
问题是这里的这一行:
Value * array = new Value[size];
这声明了一个新array
变量。您正在分配它array
,而不是您的成员变量array
。
答案很简单,只需将其更改为:
array = new Value[size];
推荐阅读
- r - 如何修复在 Shiny 中未弹出 esquisserUI 的过滤器选项?
- javascript - 下一个 js:元素类型无效:需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:未定义
- java - 在 TextView 中增加数字
- amazon-web-services - 如何在官方 Perforce AMI 上使用 AWS 部署的 Helix Core 服务器上启用 SSL
- javascript - 解析错误:意外的标记条带?夹板
- java - 如何在给定范围内将 3 位数字“打包”成一个数字?
- elixir - 如何将事件直接从 Phoenix Live View 发送到组件
- python - 如何解决 matplotlib 3.5 中的多个刺?
- amazon-web-services - 在 AWS SES 中,我的发送区域和接收区域可以不同吗?
- plugins - 是否可以基于 Keycloak SPI 制作 Keycloak 侦听器以将配置从领域复制到新创建的领域?