C ++, как достичь поведения «стека» в этом коде? - PullRequest
3 голосов
/ 05 марта 2019

Я хотел бы задать 2 вопроса об этом коде.Где я просто пытаюсь смоделировать стек.

Stack.h

 #pragma once

namespace stackandqueue {

    class Stack
    {
    private:
        int index;
        int *stackdata;

    public:     
        Stack();    
        ~Stack();
        void push(int val);
        int pop();
        int top();
        bool isEmpty();
    };

}

Stack.cpp

#include "stdafx.h"
#include "Stack.h"

namespace stackandqueue {

        Stack::Stack() : index{ 0 }
        {
            stackdata = new int[index];
        }
        Stack::~Stack()
        {
            delete[] &stackdata;
        }
        void Stack::push(int val) {
            stackdata[index] = val;
            index++;
        }
        int Stack::pop() {
            int val = stackdata[index];
            index--;
            return val;
        }
        int Stack::top() {
            return stackdata[index];
        }
        bool Stack::isEmpty() {
            return index == 0;
        }
}

Смысл в том, чтобы позволить мне создать

 Stack stack;

И затем он инициализирует динамический массив с 0 в качестве первого индекса, который позволяет мне выдвигать, всплывать, верхние значения.

Первый вопрос: почему у меня есть неразрешенные символы для определений методов?

Второй вопрос: по поводу «stackdata» вы считаете правильным, если я хочу объявить «массив» с динамическим размером для этого поведения?

Я открыт для улучшений и лучших практик.Я привык к языкам программирования, но я никогда не вникал в c ++ и не хочу иметь плохих практик.Итак, вы видите, что я беру его с самого начала.

Спасибо.


Я публикую решение, достигнутое с вашей помощью, которое, возможно, кому-то поможет.

class Stack
    {
    private:
        int index;
        int* stackdata;

    public:     
        Stack(int size);    
        ~Stack();
        void push(int val);
        int pop();
        int top();
        bool isEmpty();
    };

    Stack::Stack(int size) 
        : index {0}, stackdata{new int[size]} 
        {
        }
        Stack::~Stack()
        {
            delete[] stackdata;
        }
        void Stack::push(int val) {
            stackdata[index] = val;
            index++;
        }
        int Stack::pop() {
            index--;
            return stackdata[index];
        }
        int Stack::top() {
            return stackdata[index-1];
        }
        bool Stack::isEmpty() {
            return index == 0;
        }

1 Ответ

5 голосов
/ 05 марта 2019

С этим связано несколько проблем.

  1. Массив, динамически распределяемый или иным образом, не является стеком / очередью / вектором.Вы создаете буквально 0 int с.Все ваши обращения к элементам после этого имеют неопределенное поведение.Вам нужен ваш массив, чтобы расти , то есть быть вектором, например, std::vector.

  2. delete[] &stackdata имеет неправильный уровень косвенности.Вы имели в виду delete[] stackdata.Вы пытались удалить указатель , который не был выделен динамически.

  3. Вам не хватает конструкторов копирования / перемещения и операторов назначения копирования / перемещения, так что как только вытранспортируйте Stack везде, где он взорвется.(Исходный экземпляр будет делать delete[] по тому же указателю, что и скопированные / перемещенные экземпляры!) Читайте о правиле три / пять / ноль.

Кроме этого,он выглядит как стек.

Проблема, с которой вы не столкнулись, это неопределенная ссылка, что забавно, потому что это единственная, о которой вы спрашивали.:) Если у вас действительно есть такая вещь, скорее всего, это проблема вашей системы сборки (не удается скомпилировать этот исходный файл), которую мы не видим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...