При наследовании от класса наследуемые переменные переопределяются унаследованным классом через родительский класс? - PullRequest
0 голосов
/ 22 февраля 2020

Я создал два класса: stack1 и stack2 и определил свои собственные операции со стеком pu sh (), pop (), isempty () и isfull (). Я пытаюсь вычислить выражение постфикса из ввода. Я создал другой класс под названием operation , который является дочерним для stack1 и stack2 , поэтому я могу получить доступ к функциям pu sh (), pop ( ), et c .. в течение операция . У меня есть функция в операция , называемая оператором (), которая выполняет грязную работу над стеками. В этой функции у меня есть время l oop, которое зависит от того, не будет ли stack1 пустым, пока операция не будет завершена; ОДНАКО, когда я перехожу через эту функцию, top1, на которую указывает stack1 , сбрасывается в 0. Есть ли способ преодолеть это / я делаю что-то не так? Это первый раз, когда я использую классы и тому подобное, поэтому я не уверен в плюсах и минусах.

Вот определения моих классов:

class stack1 {
    private:
        int num1[SIZE/2];       int top1;
    public:
        void push1(int data)
        {
            if (is_full1());
            else
            {
                num1[top1] = data;
                top1++;
            }
        }
        int pop1(void)
        {
            if(is_empty1());
            else
            {
                top1--;
                return num1[top1];
            }
        }
        int is_empty1(void)
        {
            if(top1 == 0)
            {
                return 1;
            }else
            {
                return 0;
            }
        }
        int is_full1(void)
        {
            if(top1 == SIZE)
            {
                return 1;
            }else
            {
                return 0;
            }
        }

        stack1()
        {
            top1 = 0;           num1[SIZE/2] = {0};
        } };

class stack2 {
    private:
        int num2[SIZE/2];       int top2;   public:
        void push2(int data)
        {
            if (is_full2());
            else
            {
                num2[top2] = data;
                top2++;
            }
        }
        int pop2(void)
        {
            if(is_empty2());
            else
            {
                top2--;
            return num2[top2];
            }
        }
        int is_empty2(void)
        {
            if(top2 == 0)
            {
                return 1;
            }else
            {
                return 0;
            }
        }
        int is_full2(void)
        {
            if(top2 == SIZE)
            {
                return 1;
            }else
            {
                return 0;
            }
        }

        stack2()
        {
            top2 = 0;           num2[SIZE/2] = {0};
        } };

class operation: public stack2, public stack1 {
    private:
        int answer;
        int a;
        int b;
        int num_cnt;
        int ans;
        int from_st1;
        int from_st2;
    public:
        int c;
        int oper(void)
        {
            answer = 0;
            a = 0;
            b = 0;
            num_cnt = 0;
            ans = 0;
            c = 0;
            stack1 st1;
            stack2 st2;
            while(!st1.is_empty1())
            {
                from_st1 = st1.pop1();
                if(from_st1 == plus)
                {
                    st2.push2(from_st1);
                }else if(from_st1 == minus)
                {
                    st2.push2(from_st1);
                }else if(from_st1 == mult)
                {
                    st2.push2(from_st1);
                }else if (from_st1 == divide)
                {
                    st2.push2(from_st1);
                }else if(num_cnt == 1)
                {
                    num_cnt = 0;
                    if(ans == 0)
                    {
                        answer = b;
                        ans++;
                    }
                    a = from_st1;
                    from_st2 = st2.pop2();
                    if(from_st2 == plus)
                    {
                        c = a+answer;
                    }else if(from_st2 == minus)
                    {
                        c = a-answer;
                    }else if(from_st2 == mult)
                    {
                        c = a*answer;
                    }else if(from_st2 == divide)
                    {
                        c = a/answer;
                    }
                }else
                {
                    b = from_st1;
                }
                num_cnt++;
            }
        return c;
        }

        operation()
        {
            answer = 0;
            a = 0;
            b = 0;
            num_cnt = 0;
            ans = 0;
            from_st1 = 0;
            from_st2 = 0;
        } };

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Я беру из постановки задачи, вы пытаетесь построить калькулятор basi c с четырьмя операторами, и вам нужно вычислить выражение basi c, используя стек. Скажем, у вас есть выражение: a + b- c d / e в стеке выглядит так: TOP e -> / -> d -> -> c -> -> b- > + -> ПУСТОЙ И этот трек должен быть оценен.

Исходя из этого .. вы можете искать что-то вроде ниже:

class stack {
    private:
        int num[SIZE];       
        int top;
    public:
        void push(int data)
        {
            if (is_full1());
            else
            {
                num[top] = data;
                top++;
            }
        }
        int pop(void)
        {
            if(is_empty());
            else
            {
                top--;
                return num[top];
            }
        }
        int is_empty(void)
        {
            if(top == 0)
            {
                return 1;
            }else
            {
                return 0;
            }
        }
        int is_full(void)
        {
            if(top == SIZE)
            {
                return 1;
            }else
            {
                return 0;
            }
        }

        stack()
        {
            top = 0;           num[SIZE] = {0};
        } 
};

class operation {
    private:
        int answer;
        int op1;
        int op;

    boolean isOperator(int val) {
        boolen retVal = false;;

        if (val == plus ||
            val == minus ||
            val == divide ||
            val == mult) {
                retVal = true;
            } 
        else {
            retVal = false;
        }
        return retVal;
    }
    public:
        int oper(stack st1)
        {
            int from_st1 = 0;
            while(!st1.is_empty())
            {
                from_st1 = st1.pop();
                if(isOperator(from_st1))
                {
                    op = from_st1;
                }
                else if(answer != 0)
                {
                    op1 = from_st1;
                    if(op == plus)
                    {
                        answer = op1 + answer;
                    }else if(op == minus)
                    {
                        answer = op1 - answer;
                    }else if(op == mult)
                    {
                        answer = op1 * answer;
                    }else if(op == divide)
                    {
                        answer = op1 / answer;
                    }
                }
                else
                {
                    answer = from_st1;
                }
            }
        return answer;
        }

        operation()
        {
            answer = 0;
            op1 = 0;
            op = 0;
        } 
};

Примечание: Вы можете сделать всю оценку с одним стеком не нужно два стека. Ваши операнды не могут быть равны целочисленным значениям для +, -, * и / для этого назначения. У вас есть допустимое выражение для ввода в стек в коде main ().

0 голосов
/ 22 февраля 2020

Я думаю, что «проблема» в строке:

stack1 st1;
stack2 st2;

Это вызовет конструктор по умолчанию и установит значение переменных top1 и top2 как ноль. Обходной путь к этому должен состоять в том, чтобы инициализировать эти переменные с некоторым положительным ненулевым значением.

Следовательно, код будет выглядеть примерно так (фокусируясь только на измененных частях):

class stack1 {
    private:
        int num1[SIZE/2];       int top1;
    public:
        .....

        stack1()
        {
            top1 = 0;           num1[SIZE/2] = {0};
        } 
        stack1(int top1)
        {this.top1 = top1;}

};

class stack2 {
    private:
        int num2[SIZE/2];       int top2;   public:
    public:
        .....

        stack2()
        {
            top2 = 0;           num2[SIZE/2] = {0};
        } 

        stack2(int top2)
        {this.top2 = top2;}
};

class operation: public stack2, public stack1 {
        .....

    public:
        int c;
        int oper(void)
        {
            .....

            //just an example, can be declared explicitly as well
            stack1 st1(5);
            stack2 st2(7);
         .....

Также Я бы посоветовал вам сделать ваш код немного более читабельным (например, наличие 3-строчного {} в if случаях, охватывающих только одну строку). Это просто ненужное потребление пространства.

И, наконец, если «переопределение» переменных родительского класса означает, что переменные, повторно присваивающие какое-либо значение при наследовании, они не будут делать, если вы не укажете явно (например, как использование конструктора в нашем случае для присвоения различных значений top1 и top2). Унаследованный класс получит копию состояния родительского класса *.

*, что означает, что они не могут быть изменены напрямую унаследованным классом. Например, если бы вы сделали: int top1=5; изначально, тогда top1 было бы 5, пока его не где-то снова не переопределить (например, с помощью конструктора)

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