Перегруженный оператор приращения ++ унаследован в производном классе

Я пытаюсь использовать оператор приращения в производном классе. Но я не могу этого добиться.

#include<iostream>
using namespace std;

class Base {
    private:
        int a;
    public:
        int x, y, z;
        int Converter(int data) {
            cout << "Printing z: " << z << endl;
            return data * x + y;
        }
        Base& operator=(int rhs) {
            a = Converter(rhs);
            return *this;
        }
        Base(int a, int x, int y, int z) : a(a), x(x), y(y), z(z) {}
        explicit Base(int a_) : a(a_) {}
        Base operator+(const Base& obj){ 
            Base x(*this);
            return Base(x.a + obj.a);
        }
        Base& operator++() { return *this = *this + Base(Converter(1)); }
};

class Derived : Base {
    public:
        Derived() : Base(0, 1, 2, 3) {} // Come constants for x, y, z
        explicit Derived(int data) : Base(data, 1, 2, 3){}
        using Base::operator=;
        using Base::operator++;
};

int main(){
    
    Derived x(10);
    ++x; 
    x = 1;
}
   

Я думаю, что проблема связана с выделенной строкой, которая была прокомментирована выше. Когда я попытался напечатать значения x, y, z в функции operator++(), он показывает 0, хотя я инициализировал их как 1, 2, 3 в определении производного класса.

Я попытался вызвать другой конструктор, как показано ниже, но все равно бесполезно.

Base& operator++() { return *this = *this + Base(Converter(1), this->x, this->y, this->z) }

На выходе получается:

Printing z: 3
Printing z: 0

Если я инвертирую порядок в main(), как показано ниже, результат будет другим.

x = 1;
++x; 

Выход:

Printing z: 3
Printing z: 3

Может ли кто-нибудь указать мне в правильном направлении?

Спасибо.

Этот код не должен компилироваться. Вы обещаете вернуть Base в operator+(), но ничего не возвращаете.

scohe001 24.12.2020 15:43

@ scohe001 Я повторно вставил после исправления ошибок. Теперь он компилируется.

RD1153 24.12.2020 15:48

Эта программа демонстрирует неопределенное поведение, достигая закрывающей скобки не-void функции Base::operator+, не встречая оператора return.

Igor Tandetnik 24.12.2020 15:49

@ RD1153 Не компилируется без предупреждений. Почему я всегда должен включать предупреждения компилятора?

JaMiT 24.12.2020 15:49

«Когда я попытался напечатать значения x, y, z в функции operator++()» — вы должны сохранить эту попытку в своем минимально воспроизводимом примере, чтобы мы могли воспроизвести ваши результаты.

JaMiT 24.12.2020 15:51

Есть несколько ошибок, и они довольно простые вещи. Компилятор должен помочь вам здесь. Прочтите ошибки и предупреждения.

Kenny Ostrom 24.12.2020 15:51

Я попытался создать MWE моей реальной проблемы. У меня есть файл cpp, в котором я определил определение оператора +.

RD1153 24.12.2020 16:01
Стоит ли изучать 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
7
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значение кода понять невозможно. Я понятия не имею, что вы пытаетесь сделать.

Но причина вывода Printing z: 0 достаточно ясна. Это исходит из этого конструктора

explicit Base(int a_) : a(a_) {}

(что на самом деле оставляет z неинициализированным, но я думаю, вы получаете 0 в своей системе)

Этот конструктор вызывается здесь

return Base(x.a + obj.a);

и этот оператор возврата вызывается из перегруженного operator+ здесь

Base& operator++() { return *this = *this + Base(Converter(1)); }

Эта последовательность перезаписывает значение *this объектом, у которого z равно 0, и это значение выводится в следующей строке кода x = 1;.

Как я уже сказал, я понятия не имею, что этот код пытается сделать, поэтому я понятия не имею, что предложить в качестве исправления, но, надеюсь, это объясняет, откуда берется это значение.

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