简体   繁体   English

如何在构造函数中初始化struct的动态数组?

[英]How to initialize the dynamic array of struct in the constructor?

This is a Stack class based on a dynamic array of struct for Depth First Search (DFS).这是一个堆栈 class 基于深度优先搜索 (DFS) 的动态结构数组。 The program is not able to run whenever it encounters the function, push(), which shows that the array is not successfully initialized in the constructor.程序在遇到function,push()时无法运行,说明在构造函数中数组没有成功初始化。

I have tried to look for the error and even changing the dynamic array of struct into parallel arrays but it still does not work.我试图寻找错误,甚至将结构的动态数组更改为并行 arrays 但它仍然不起作用。 I apologize if the problem seems to be too simple to be solved as I do not have a strong foundation in C++.如果问题似乎太简单而无法解决,我深表歉意,因为我没有扎实的 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 

I expect it to run well but an exception is always thrown on line 80, which is as follows:我希望它运行良好,但第 80 行总是抛出异常,如下所示:

Exception thrown at 0x00007FF6A160487C in Assignment1.exe: 0xC0000005: Access violation writing location 0x0000000000000000.

The problem is this line right here:问题是这里的这一行:

Value * array = new Value[size];

This declares a new array variable.这声明了一个新的array变量。 You are allocating that array instead, and not your member variable array .您正在分配该array ,而不是您的成员变量array

The answer is simple, just change it to this instead:答案很简单,只需将其更改为:

array = new Value[size];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM