Ошибка компиляции в C ++ при использовании оператора присваивания =? - PullRequest
0 голосов
/ 08 ноября 2018

Я написал программу, которую мне дали в качестве домашнего задания (она немного длиннее).Проблема в том, что он компилируется в CodeBlocks, но не компилируется в Visual Studio 2017 , он говорит - binary '=': no operator found which takes a right-hand operand of type 'CAutomobile' (or there is no acceptable conversion.Я хотел бы спросить, почему это происходит, потому что я сам не смог найти ошибку?Я попытался прокомментировать функцию оператора =, но ошибка все равно осталась.

#include <iostream>
#include <algorithm>
#include <string>
#include <stdlib.h>
using namespace std;
class CVehicle {
    string name;
    int year;
public:
    CVehicle() {
        name = "Car";
        year = 1990;
    }
    CVehicle(string n, int y) {
        name = n;
        year = y;
    }
    CVehicle(const CVehicle& vc) {
        name = vc.name;
        year = vc.year;
    }
    void setName(string n) {
        name = n;
    }
    void setYear(int y) {
        year = y;
    }
    string getName() {
        return name;
    }
    int& getYear() {
        return year;
    }
    virtual void Print(ostream& os) = 0;
};
class CAutomobile :public CVehicle {
    double litres;
public:
    CAutomobile() :CVehicle() {
        litres = 7.2;
    }
    CAutomobile(string nm, int yr, double l) :CVehicle(nm, yr) {
        litres = l;
    }
    void setLitres(double l) {
        l = litres;
    }
    double& getLitres() {
        return litres;
    }
    void Print(ostream& os) override {
        os << getName() << endl;
        os << getYear() << endl;
        os << litres << endl;
    }
    friend bool operator< (CAutomobile a1, CAutomobile a2) {
        if (a1.litres < a2.litres) {
            return true;
        }
        return false;
    }
    CAutomobile operator= (CAutomobile&  at) {
        CAutomobile au;
        au.getName() = at.getName();
        au.getYear() = at.getYear();
        au.getLitres() = at.getLitres();
        return au;
    }
    CAutomobile operator+(CAutomobile aut) {
        CAutomobile a;
        a.getLitres() = getLitres() + aut.getLitres();
        return a;
    }
    friend ostream& operator<< (ostream& o, CAutomobile a) {
        o << a.getName() << endl;
        o << a.getYear() << endl;
        o << a.getLitres() << endl;
        return o;
    }
};
int main()
{
    CAutomobile a[] = {
    CAutomobile(),
    CAutomobile("Wolkswagen",1970,80.5),
    CAutomobile("Fiat",1979,21.9),
    CAutomobile("Opel",1978,13.7)
    };
    for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
        cout << "Name" << ' ' << a[i].getName() << endl;
        cout << "Year" << ' ' << a[i].getYear() << endl;
        cout << "Litres" << ' ' << a[i].getLitres() << endl;
    }
    int range = 2016 - 1990 + 1;
    for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
        a[i].setLitres(rand() % 100 + 1);
        a[i].setYear(rand() % range + 1996);
    }
    //сортираме масива по литри и извеждаме 
    //най малкия (първия) му елемент
    for (int i = 0; i < sizeof(a-1); i++) {
        for (int j = 0; j < sizeof(a-1); j++) {
            if (a[j].getLitres() > a[j + 1].getLitres()) {
                swap(a[j], a[j + 1]);
            }
        }
    }   
    cout << a[0] << endl;
    CAutomobile k = a[0] + a[3];
    cout << k.getLitres() << endl;
}

1 Ответ

0 голосов
/ 08 ноября 2018

CAutomobile::operator = совершенно неверно. Он принимает неконстантную ссылку и присваивает свое поле новому объекту. Вместо этого он должен взять константную ссылку и изменить текущий объект.

CAutomobile & operator =(CAutomobile const & other)
{
    assert(this != ::std::addressof(other)); // check for self-assignment
    SetName(other.getName());
    SetYear(other.getYear());
    SetLitres(other.getLitres());
    return *this;
}

Это вызовет еще одну проблему: геттеры не соответствуют требованиям const, поэтому они также должны быть исправлены:

string const & getName(void) const {
    return name;
}
int const & getYear(void) const {
    return year;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...