Conversion from string literal to 'char *' is deprecated
-
Hallo liebes Forum,
bei folgendem Code tritt die Fehlermeldung
*Conversion from string literal to 'char ' is deprecated --> Zeile 36
auf und ich weiß einfach nicht warum. Programmiert wird mit XCode.
---------------------------------------------------------------------------
#include <iostream>
class test
{
char *name;
public:
test(char *nam);
void get_name();
};test::test(char *nam)
{
strcpy(name,nam);
}void test::get_name()
{
std::cout << name;
}int main(int argc, const char * argv[])
{test eins("Test");
eins.get_name();}
--------------------------------------------------------------------------------
Wäre toll, wenn mir jemand helfen kann.
Ich hab auch schon erlebt, dass manchmal (nicht bei diesem Beispiel) nicht kompiliert werden konnte,
weil ein Problem vorlag. Nachdem ich xCode geschlossen und wieder geöffnet hatte, funktionierte der Code problemlos.Beste Grüße & noch ein frohes neues Jahr
Fabian
-
Weisst du denn was ein String literal ist?
-
Ein Stringliteral ist doch ein Objekt der Klasse String, welches die Zeichen zwischen den doppelten Anführungsstrichen enthält.
Edit:
Wenn ich schreibe
test::test(char *nam)
{
name = nam;
}Dann funktioniert es.
Verwende ich strcpy als nur, wenn ich in der test class z.b. char name[10] schreibe?
Also bei zeichenbegrenzten Arrays?name = nam funtioniert, weil es sich um ein Objekt (der Klasse String) handelt, oder?
-
Die von dir angegebene Codezeile kann nicht das Problem sein. Vergleich doch mal die Typen von
nameundnamUnd deine Definition von String literal ist falsch. Wie kommst du darauf? Ausserdem benutzt du doch garkeine Objekte vom Typ string. Schau nochmal in deinen Quellen nach!
Edit:
strcpy(name, nam)ist auch nicht das selbe wiename = nam
-
Hui, da sind so viele Fehler drin..
1. In C++ mag man eher std::string, das ist eine Klasse für die die ganzen intuitiven Operatoren (=, +=, ==, ..) überladen sind, der kümmert sich auch gleich um Speicher etc.2. Die Probleme mit deinem Code:
- Ein String Literal (also alles zwischen "") hat den Typ const char[N], wobei N die Anzahl der Zeichen im Literal + 1 (für die Nullterminierung '\0') ist.
- Ein Array kann zu einem Pointer auf sein erstes Element zerfallen, deshalb geht folgendes:const char* s = "Hallo!"; // s zeigt jetzt auf HDank der Nullterminierung muss die Länge nicht separat gespeichert werden.
Ich hoffe dir sind die kleinen "const" hier aufgefallen. Ein String Literal ist nämlich konstant (du darfst nicht rein schreiben). Das s oben ist z.B. vom Typ "pointer to const char". Heißt, das hier würde einen Compilerfehler geben:s[0] = 'L';Weil der Compiler durch den Typ weiß, dass man das nicht machen soll. Wenn du jetzt aber schreibst
char* s = "Hallo";Dann kann dich der Compiler bei
s[0] = 'L';nicht mehr davor beschützen etwas Falsches zu machen. Daher ist diese implizite Konvertierung illegal.
Und du hast noch ein Problem: Bei deinem strcpy: name zeigt nicht auf einen gültigen Speicherbereich!
Und was ein get_name mit void als Rückgabetyp machen soll, musst du mir auch mal erklären.
Ein Stringliteral ist doch ein Objekt der Klasse String, welches die Zeichen zwischen den doppelten Anführungsstrichen enthält.
Ne. Stringliterale sind, wie oben beschrieben, einfach nur Arrays. Nix Klasse.

-
ach cooky ... jetzt hast du wieder einfach alles verraten
-
F4b14n schrieb:
und ich weiß einfach nicht warum
Sieht so aus, als hättest du nicht verstanden, was
char*bedeutet. Tipp: Es ist kein Typ für String-Variablen. Ist ist ein Typ für Zeiger. Von Zeigern solltest du so lange wie möglich die Finger lassen. Und die Funktionen wie strcpy lässt du am besten ganz bleiben.