Ich habe das Problem in C ++, dass ich nicht herausfinden kann, wie ich mich an Zeiger auf die neu zugewiesenen Zeichenfolgen in der Funktion getName () erinnere. Ich erstelle eine Kopie des gewünschten Namens, damit der Benutzer keinen Zeiger auf den tatsächlich zugewiesenen Namen erhalten kann. Aber ich kann nicht Finde einen Weg, diese zugewiesenen Kopien freizugeben! Gibt es einen anderen Weg als Listen? oder Array? Dankeschön

Dies ist die Definition der Mitgliedsfunktion getName ().

char * Course::getName() const
{
    char* CourseNameCopy= new char*(strlen(CourseName)+1);
    return CourseNameCopy;
}
0
Sijaan Hallak 4 Jän. 2016 im 20:50

3 Antworten

Beste Antwort

Verwenden Sie std::string, es sei denn, Sie haben einen bestimmten Grund, dies nicht zu tun. Ihr Code sieht aus wie ein Paradebeispiel für eine Zeichenfolge.

#include <string>

std::string Course::getName() const
{
    return CourseName; // This will return a copy
}

Natürlich müssen Sie Ihre Mitgliedsvariable so ändern, dass sie auch eine std::string CourseName; ist.

Dadurch wird Ihr Code viel sicherer und leichter zu lesen. Dies ist die bevorzugte Methode in C ++, es sei denn, Sie sind kein Anfänger mehr und haben einen ganz bestimmten Grund, dies nicht zu tun.

1
Ela782 4 Jän. 2016 im 19:03
char * Course::getName() const
{
    char* CourseNameCopy= new char[strlen(CourseName)+1];
    strcpy(CourseNameCopy, CourseName);
    return CourseNameCopy;
}

Ich habe einige Korrekturen am Originalcode vorgenommen, damit er das tut, was er behauptet zu tun.

Wenn ein Zeiger auf ein modifizierbares Zeichenarray zurückgegeben werden muss, das eine Kopie des Kursnamens enthält, ist dies der richtige Weg. Aber das ist eine sehr ungewöhnliche Anforderung. Normalerweise reicht es aus, einen Zeiger auf ein nicht modifizierbares Zeichenarray zurückzugeben, und dafür ist nur das interne Array erforderlich:

const char * Course::getName() const
{
    return CourseName;
}

Damit können Benutzer den Namen des Kurses anzeigen, aber nicht ändern. Wenn jemand aus irgendeinem Grund mit dem zurückgegebenen Text herumspielen muss, kann er seine eigene Kopie erstellen und diese ändern.

2
Pete Becker 4 Jän. 2016 im 18:11

... damit der Benutzer keinen Zeiger auf den tatsächlich zugewiesenen Namen erhalten kann ...

Sie haben hier ein leichtes Missverständnis. Der Client (Benutzer) muss keinen Zugriff auf den Name haben. Nur der Zeigerwert (Adresse) reicht aus, um ihn später zu löschen. Daher müssen Kunden nur Folgendes tun:

Course c("XYZ");

char* n = c.getName();

// deallocate after use
delete[] n;

Beachten Sie auch, dass Sie den Inhalt nicht kopiert haben:

char * Course::getName() const {
    char* CourseNameCopy= new char*(strlen(CourseName)+1);
    strcpy(CourseNameCopy,CourseName); // <<<<<<<<<
    return CourseNameCopy;
}

Ich muss erwähnen, dass dies keine gute Lösung ist, da die Clients Ihres Codes dafür verantwortlich sind, sich um die Speicherverwaltung zu kümmern.

Verwenden Sie besser eine std::string Mitgliedsvariable für CourseName, die für diese entwickelt wurde und sich um die gesamte Speicherverwaltung unter der Haube kümmert.

0
πάντα ῥεῖ 4 Jän. 2016 im 18:25