Измените поля базового класса в производном классе с помощью метода базового класса

Я не уверен, где я ошибаюсь, но, похоже, с моей стороны есть какая-то неверная концепция. У меня есть базовый класс, производный класс и некоторые методы, как в этом примере.

class Base {
    public:
    int curr_loc;
    Base(int curr_loc):curr_loc(curr_loc)
    void reset(int curr_loc){
        curr_loc = curr_loc;
    }
}

class Derived: public Base{
    public:
    Derived(int curr_loc):Base(curr_loc)
}

Derived a(1);
a.reset(2);
a.curr_loc //is still 1?

Когда я сейчас вызываю "a.curr_loc", я все еще получаю 1. Я думал, что переопределю значение с помощью сброса метода, но это делается для другого объекта... Есть ли способ сделать это без необходимости копировать функции базового класса для производного класса?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

curr_loc = curr_loc;

Эта строка ничего не делает. Он присваивает переменную самой себе. Тот факт, что существует также переменная экземпляра с именем curr_loc, здесь не упоминается, поскольку ее затеняет локальная переменная с тем же именем.

Вы можете либо переименовать аргумент во что-то другое, либо явно использовать this для назначения.

this->curr_loc = curr_loc;
Ответ принят как подходящий

Этот фрагмент кода

class Base {
    public:
    int curr_loc;
    Base(int curr_loc):curr_loc(curr_loc)
    void reset(int curr_loc){
        curr_loc = curr_loc;
    }
}

class Derived: public Base{
    public:
    Derived(int curr_loc):Base(curr_loc)
}

имеет синтаксические ошибки.

Вам нужно написать

class Base {
    public:
    int curr_loc;
    Base(int curr_loc):curr_loc(curr_loc){}
    void reset(int curr_loc){
        Base::curr_loc = curr_loc;
    }
};

class Derived: public Base{
    public:
    Derived(int curr_loc):Base(curr_loc) {}
};

Обратите внимание на определение сброса функции-члена. Он должен быть определен как

    void reset(int curr_loc){
        Base::curr_loc = curr_loc;
    }

или нравится

    void reset(int curr_loc){
        this->curr_loc = curr_loc;
    }

В противном случае параметр ciur_loc в этом операторе присваивается самому себе.

        curr_loc = curr_loc;

потому что он скрывает элемент данных с тем же именем класса Base.

Большое спасибо. Я не знал, что это ключевое слово работает через указатель... Пробовал this.curr_loc, который не работает в c++

PySeeker 03.04.2022 10:39

Другие вопросы по теме