Я пытаюсь использовать оператор приращения в производном классе. Но я не могу этого добиться.
#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
Может ли кто-нибудь указать мне в правильном направлении?
Спасибо.
@ scohe001 Я повторно вставил после исправления ошибок. Теперь он компилируется.
Эта программа демонстрирует неопределенное поведение, достигая закрывающей скобки не-void
функции Base::operator+
, не встречая оператора return
.
@ RD1153 Не компилируется без предупреждений. Почему я всегда должен включать предупреждения компилятора?
«Когда я попытался напечатать значения x, y, z в функции operator++()» — вы должны сохранить эту попытку в своем минимально воспроизводимом примере, чтобы мы могли воспроизвести ваши результаты.
Есть несколько ошибок, и они довольно простые вещи. Компилятор должен помочь вам здесь. Прочтите ошибки и предупреждения.
Я попытался создать MWE моей реальной проблемы. У меня есть файл cpp, в котором я определил определение оператора +.
Значение кода понять невозможно. Я понятия не имею, что вы пытаетесь сделать.
Но причина вывода 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;
.
Как я уже сказал, я понятия не имею, что этот код пытается сделать, поэтому я понятия не имею, что предложить в качестве исправления, но, надеюсь, это объясняет, откуда берется это значение.
Этот код не должен компилироваться. Вы обещаете вернуть
Base
вoperator+()
, но ничего не возвращаете.