iso c++ does not allow conversion from string literal to char*

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

iso c++ does not allow conversion from string literal to char*

Hej,

Jag försöker skriva koden:

#include <iostream> using namespace std; // klass dog, en hund som kan skälla class Dog { public: char* name; int age; char* race; //metod bark. hunden skäller void Bark() { if(age > 1) cout << name << "skäller voff voff!"; else cout << name << "skäller inte"; } }; //start program int main () { Dog myDog; myDog.age = 3; myDog.name = "Fido"; myDog.race = "tax"; cout << "hunden heter " << myDog.name << ", är en " << myDog.race << "och är " << myDog.age << "år gammal" << endl; myDog.Bark(); cin.get(); return 0; }

Det står vid myDog.name och myDog race att: iso c++ does not allow conversion from string literal to char*
Jag har gjort enligt kursbok men det blir fel?

Trädvy Permalänk
Medlem
Plats
Rättvik
Registrerad
Maj 2011
Skrivet av apan82ful:

Hej,

Jag försöker skriva koden:

#include <iostream>

using namespace std;
// klass dog, en hund som kan skälla
class Dog
{
public:
char* name;
int age;
char* race;

//metod bark. hunden skäller
void Bark()
{
if(age > 1)
cout << name << "skäller voff voff!";
else
cout << name << "skäller inte";
}
};

//start program
int main ()
{
Dog myDog;

myDog.age = 3;
myDog.name = "Fido";
myDog.race = "tax";

cout << "hunden heter " << myDog.name << ", är en " << myDog.race << "och är " << myDog.age << "år gammal" << endl;
myDog.Bark();

cin.get();
return 0;

}

Det står vid myDog.name och myDog race att: iso c++ does not allow conversion from string literal to char*
Jag har gjort enligt kursbok men det blir fel?

Om du ändrar till sträng istället för char är gjord för att innehålla bara ett tecken inte en sträng.
Så om du deklarerar dina variabler med
string name;
string race;

Så ska de nog funka. Det var längesen jag höll på med c++.

#include <iostream> using namespace std; // klass dog, en hund som kan skälla class Dog { public: string name; int age; string race; //metod bark. hunden skäller void Bark() { if(age > 1) cout << name << "skäller voff voff!"; else cout << name << "skäller inte"; } }; //start program int main () { Dog myDog; myDog.age = 3; myDog.name = "Fido"; myDog.race = "tax"; cout << "hunden heter " << myDog.name << ", är en " << myDog.race << "och är " << myDog.age << "år gammal" << endl; myDog.Bark(); cin.get(); return 0; }

Då funkade det för mig. När jag ändrade-.

Testa nyss

CPU -->I7-3820
GPU -->2 x Nvidia680 GTX
OS --> Fedora

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

@Sandia: Tackar tackar, fattar inte hur många fel det är i denna boken alltså.

Trädvy Permalänk
Medlem
Registrerad
Okt 2013

Sandia lösning fungerar.

Du har använt dig av en char pekare som du dessutom inte initialiserar i ditt program.
Till att börja med måste du allokera minne och sedan låta din char pekare peka på detta minne.
Läs på lite mer om hur detta fungerar och vilka konverteringar som finns/behövs så kommer även ditt första utkast att fungera.
Tips att titta på en constructor till din class Dog.

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

@loffis: Gött så!

Men varför väljer man att använda en char pekare när man kan använda string?

Trädvy Permalänk
Medlem
Registrerad
Okt 2013

Finns anledningar.
Bara att läsa på. Titta efter var själva texten hamnar (heap/stack).
Detta kan ha betydelse när man vill överföra information mellan processer/threads.
Går att optimera väldigt mycket i C++ beroende på vad man vill åstadkomma.
Även minnesåtgång kan kontrolleras bättre.
En annan anledning för dig kan vara att du lär dig exempel på vad constructor och destructor kan användas till.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av apan82ful:

Det står vid myDog.name och myDog race att: iso c++ does not allow conversion from string literal to char*
Jag har gjort enligt kursbok men det blir fel?

char* är en pekare till en char, som antingen kan vara en ensam char eller början på en array med chars. Det viktiga i sammanhanget är att den pekar på minne som får ändras. "Fido" är däremot en sträng-literal, som har typen const char*. D.v.s. det är en char-pekare som pekar på minne som man inte får ändra på. Du får därför inte lagra en sträng-literal i en char*. Att boken ändå skriver detta beror troligtvis på att författaren använt en gammal C++-kompilator som tillåtit detta, då det är en gammal kvarleva från C att det tillåts.

Det finns flera olika sätt att fixa detta problem på:

  • Deklarera name och race som const char*. Då kommer du så klart inte kunna modifiera strängarna som de innehåller.

  • Använd t.ex. strdup för att kopiera sträng-literalerna till minne som name och race tillåts peka på. För denna metod bör du ha en konstruktor i Dog som kan nolla name och race, samt en destruktor som kan frigöra minnet. För att se till att minne alltid allokeras så bör också name och race endast tilldelas genom en klass-metod som sköter minnesallokeringen.

  • Inse att det är C++ och inte C du skriver, och använd string som sköter all allokering/deallokering åt dig

Det sista alternativet är så klart att föredra, men att förstå hur char* (eller array-pekare i allmänhet) fungerar är förstås också viktigt. Om inte annat för att förstå varför man bör försöka undvika dem så mycket som möjligt