“Geen levensvatbare overbelaste ‘=’ ” waarom?

Ik ben een project aan het maken voor een van mijn lessen en ik ben er vrij zeker van dat ik bijna klaar ben met het project. In principe moet ik kaartjes voor 2 personen invoeren en moet ik de maximum- en minimumprijs vinden. Ik moet de * en / operators overbelasten om dat probleem voor het project op te lossen. Ook is de friend-verklaring een noodzaak voor dit project via de instructies van de leraar.

Nu, voor de kwestie. Ik probeer de juiste ticketvariabele (t1 of t2) in t3 op te slaan, zodat ik die terug kan sturen naar de main. Als ik “=” gebruik om t1 op t3 in te stellen, staat er “no vivid overloaded ‘='”. Het volgende is mijn code:

#include <iostream>
using namespace std;
class ticket
{
public:
    ticket();
    double input();
    double output();
    friend ticket operator *(const ticket &t1, const ticket &t2);
    friend ticket operator /(const ticket &t1, const ticket &t2);
private:
    void cost();
    string name;
    double miles, price;
    int transfers;
};
int main()
{
    ticket customer1, customer2, customer3;
    //------------------------------------------------
    cout << "*** Customer 1 ***" << endl;
    customer1.input();
    cout << "--- Entered, thank you ---" << endl;
    cout << "*** Customer 2 ***" << endl;
    customer2.input();
    cout << "--- Enter, thank you ---" << endl;
    //------------------------------------------------
    //------------------------------------------------
    cout << "Testing of the * operator: " << endl;
    customer3 = customer1 * customer2;
    cout << "*** Database printout: ***" << endl;
    customer3.output();
    cout << endl;
    cout << "--- End of Database ---" << endl;
    //------------------------------------------------
    //------------------------------------------------
    cout << "Testing of the / operator:" << endl;
    customer3 = customer1 / customer2;
    cout << "*** Database printout: ***" << endl;
    customer3.output();
    cout << endl;
    cout << "--- End of Database ---" << endl;
    //------------------------------------------------
        return 0;
}
ticket operator *(const ticket &t1, const ticket &t2)
{
    ticket t3;
    if (t1.price > t2.price)
        t3 = t1.price;
    else
        t3 = t2.price;
    return t3;
}
ticket operator /(const ticket &t1, const ticket &t2)
{
    ticket t3;
    if (t1.price < t2.price)
        t3 = t1.price;
    else
        t3 = t2.price;
        return t3;
}
ticket::ticket()
{
}
double ticket::input()
{
    cout << "Miles? ";
    cin >> miles;
    cout << endl << "Transers? ";
    cin >> transfers;
    cout << endl << "Name? ";
    cin >> name;
    cost();
    cout << endl << "Price is: " << price << endl;
    return miles;
}
double ticket::output()
{
    cout << name << '\t' << miles << "mi \t " << transfers << " transfers \t" << price;
    return miles;
}
void ticket::cost()
{
    price = (.5 * miles) - (50 * transfers);
}

Antwoord 1, Autoriteit 100%

U definieert geen operator=voor ticketDAT EEN DUBBELE NAAULLEN ZIJN ALS HERDELING. Dientengevolge kunt u geen doubles toewijzen aan ticketobjecten.


Antwoord 2, Autoriteit 50%

Zo krijg ik dezelfde compileerfout. Ik heb een van mijn getter-functies gemarkeerd als constterwijl ik de klassenlidvariabele nog steeds wil wijzigen. Zie het volgende eenvoudige voorbeeld:

class CPath {
private: 
    std::string m_extension; 
public: 
    std::string GetExtension() const {
        if (m_extension.length()==0) {
            m_extension = "txt";
        }
        return m_extension; 
    }
}

In dit geval hebben we twee oplossingen:

1) laat de modifier constin de functiedefinitie vallen;
2) markeer de eigenschap m_extensionals mutable.


Antwoord 3

misschien wilt u een ledenfunctie

set_price(const& double price)

zodat u de foutcode zo kunt wijzigen, wat beter zou zijn

if (t1.price > t2.price)
        t3.set_price(t1.price);
    else
        t3.set_price(t2.price);

Other episodes