Mijn eigen toString() methode maken op c++ ​​struct

Ik ben gewend om de Java toString()-methode op mijn eigen objecten in klassen te gebruiken, maar ik weet niet zeker waar ik de fout in ga met de volgende code:

   struct Student {
    std::string name;
    int age;
    double finalGrade;
    std::string toString() {
        return "Name: " + name + "\n Age: " + age + "\n Final Grade: " + finalGrade;
    }
};

Ik begin pas c++ te leren, dus elk advies wordt op prijs gesteld


Antwoord 1, autoriteit 100%

Je kunt niets toevoegen aan een std::stringzoals je kunt aan een Java String. Met name wordt van de meeste objecten niet verwacht dat ze een toString-lidfunctie hebben. De standaardbibliotheek biedt echter std::to_stringwaarmee u numerieke waarden kunt converteren naar een std::string. U kunt bijvoorbeeld de numerieke waarden omwikkelen met een std::to_stringom uw functie te herstellen :

#include <string>
struct Student {
    std::string name;
    int age;
    double finalGrade;
    std::string toString() {
        return "Name: " + 
            name + 
            "\n Age: " + 
            std::to_string(age) + 
            "\n Final Grade: " + 
            std::to_string(finalGrade);
    }
};

Bewerken: hoewel dit antwoord uitlegt waarom wat je hebt geprobeerd niet werkt, heeft de oplossing van het andere antwoord de voorkeur.


Antwoord 2, autoriteit 100%

In tegenstelling tot java biedt C++ geen vooraf gedefinieerde “toString”-methode die impliciet wordt aangeroepen wanneer een stringrepresentatie van een object wordt gevraagd. Dus je toString-methode zal dan expliciet moeten worden aangeroepen.

In C++ is echter iets soortgelijks beschikbaar door de operator <<voor streams te overschrijven. Daarbij kunt u de objectinhoud direct naar een stream “verzenden” (zonder dat u alles in een tussenliggend stringobject hoeft op te slaan). En u kunt dezelfde code ook gebruiken om een ​​tekenreeks in te vullen die moet worden geretourneerd door een toStringmethode:

struct Student {
    std::string name;
    int age;
    double finalGrade;
    std::string toString() const;
};
ostream& operator << (ostream &os, const Student &s) {
    return (os << "Name: " << s.name << "\n Age: " << s.age << "\n Final Grade: " << s.finalGrade  << std::endl);
}
std::string Student::toString() const {
    stringstream ss;
    ss << (*this);
    return ss.str();
}
int main() {
    Student stud { "john baker", 25, 1.2 };
    std::cout << "stud directly: " << stud << endl;
    std::string studStr = stud.toString();
    std::cout << "stud toString:" << studStr << endl;
}

Antwoord 3, autoriteit 67%

Je kunt int niet toevoegen aan std::string omdat de std::stringoperator+niet overbelast was naar int.

De beste oplossing is om stringstream te gebruiken:

#include <sstream>
std::string toString() {
    std::ostringstream strout;
    strout<< "Name: " << name << "\n Age: " << age << "\n Final Grade: " << finalGrade;
    return strout.str();
}

Antwoord 4, autoriteit 22%

Je kunt niet zomaar een intof een doubletoevoegen aan een std::string. Gebruik std::to_stringom ze eerst te converteren. Dit zou goed moeten werken:

std::string toString() {
    return "Name: " + name + "\n Age: " + std::to_string(age) + "\n Final Grade: " + std::to_string(finalGrade);
  }

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes