Функция pop () стека в C ++ для члена класса - PullRequest
0 голосов
/ 18 октября 2019

Прошло много времени с тех пор, как я в последний раз писал код на C ++, но в настоящее время я застрял с проблемой, которую я не могу понять ... Рассмотрим следующий код

#include <stack>
#include <iostream>

class test{
    private:
        std::stack<int> member;

    public:
        test(std::stack<int> u){
            while(!u.empty()){
                member.push(u.top());
                u.pop();
            }
        }

        int top_from_member(void){
            return member.top();
        }

        void pop_from_member(void){
            member.pop();
        }
};

int main(){
    std::stack<int> a;

    a.push(1);
    a.push(2);

    test b = test(a);
    std::cout << b.top_from_member() <<"\n";
    b.pop_from_member();
    std::cout << b.top_from_member() <<"\n";

    return 0;
}

Iтолько что написал класс, который имеет закрытый член типа stack и написал функции для получения верхнего значения и извлечения значения. Это работает так, как я надеялся. Теперь рассмотрим в сравнении с ним следующий код

#include <stack>
#include <iostream>

class test{
    private:
        std::stack<int> member;

    public:
        test(std::stack<int> u){
            while(!u.empty()){
                member.push(u.top());
                u.pop();
            }
        }

        int top_from_member(void){
            return member.top();
        }

        void pop_from_member(void){
            member.pop();
        }
};


class test2{
    private:
        test member2;
    public:
        test2 (test v) : member2(v){}

        test get_stack(void) const {
            return this->member2;
        }
};


int main(){
    std::stack<int> a;

    a.push(1);
    a.push(2);

    test2 b = test2(a);
    std::cout << b.get_stack().top_from_member() <<"\n";
    b.get_stack().pop_from_member();
    std::cout << b.get_stack().top_from_member() <<"\n";

    return 0;
}

Единственное отличие состоит в том, что у меня теперь есть второй класс, который имеет закрытый член типа test. Я написал функцию get_stack для возможности превышения стека от test::member, а затем снова использовал top_from_member и pop_from_member. Кажется, что top_from_member работает просто отлично, но pop_from_member ничего не делает. Может кто-нибудь объяснить, почему и как мне нужно изменить pop_from_member, чтобы заставить это работать?

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Вы возвращаете копию стека. Попробуйте вместо этого вернуть ссылку.

        const test& get_stack(void) const {
            return this->member2;
        }
1 голос
/ 18 октября 2019

Вы не можете использовать b.get_stack() для изменения b, потому что test2::get_stack равно const. Как вы ожидаете изменить b, когда вы вызываете только const функции для него?

На самом деле, test2 не имеет не-1010 * функций-членов, поэтому нет абсолютно никакого способа изменитьtest2 объект. Вызов get_stack() вызывает функцию-член const, которая разумно не дает возможности изменить объект, для которого она вызывается.

Добавить функцию-не-1016 *, которая возвращает изменяемую ссылку илиеще лучше добавить функцию pop к test2.

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