Trädvy Permalänk
Medlem
Registrerad
Mar 2017

Skapa metod, c++

Hej,

Jag försöker skapa en metod för att returnera en string. Hela koden (långt ifrån fördig) ser ut så här:

#include <iostream> #include <string> using namespace std; class Town { public: string name; int minTemp; int maxTemp; void Stadsnamn(); static void info(); Town(string _name, int _minTemp, int _maxTemp); }; //metod konstruktor Town::Town(string _name, int _minTemp, int _maxTemp) { name = _name; minTemp = _minTemp; maxTemp = _maxTemp; } //metod void Town::Stadsnamn() { if (minTemp < maxTemp) cout << name << ""; else cout << name << "olika städer "; } //metod string som returnerar name string Town::name() { return name; }

Jag får fel vid "string Town::name()"

felmeddelandet jag får är: redefinition of name as different kind of symbol.

När jag gör en liknande, nedan så fungerar det.

void Town::Stadsnamn() { if (minTemp < maxTemp) cout << name << ""; else cout << name << "olika städer ";

Borde det inte vara på samma sätt man skriver?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Dec 2011

Du har en variabel som heter name, så du kan inte ha en funktion som heter samma sak.

Intel Core i7 4790k | ASUS STRIX GTX 980 OC | 1TB SAMSUNG 850 EVO

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

Om du skapar en definition där nere måste du också deklarera den i din class där uppe, om din nya function nu skulle vara string Town::GetName(){ return "TheName"; } så ska den deklareras som string Town::GetName();. Och som ovanstående säger så kan du inte använda dig av variabeln name som du gör.

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

@addy1995: Om jag byter namn på det får jag fel att jag inte har deklarerat den i glassen town.

//metod string som returnerar name string Town::getName() { return getName; }

eller så

//metod string som returnerar name string Town::getName() { return name; }

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

@Dalton Sleeper:
Jag har ändrat lite men får inte till det. antagligen är det inte så här du menar?

#include <iostream> #include <string> using namespace std; class Town { public: string getName(); //string name; int minTemp; int maxTemp; void Stadsnamn(); static void info(); Town(string _getName, int _minTemp, int _maxTemp); }; //metod konstruktor Town::Town(string _getName, int _minTemp, int _maxTemp) { getName() = getName(); minTemp = _minTemp; maxTemp = _maxTemp; } //metod void Town::Stadsnamn() { if (minTemp < maxTemp) cout << getName() << "d"; else cout << getName() << "olika städer "; } //metod string som returnerar name string Town::getName() { return getNames(); }

Trädvy Permalänk
Medlem
Plats
--
Registrerad
Dec 2004
Skrivet av apan82ful:

@Dalton Sleeper:
Jag har ändrat lite men får inte till det. antagligen är det inte så här du menar?

#include <iostream> #include <string> using namespace std; class Town { public: string getName(); string name; int minTemp; int maxTemp; void Stadsnamn(); static void info(); Town(string _getName, int _minTemp, int _maxTemp); }; //metod konstruktor Town::Town(string _getName, int _minTemp, int _maxTemp) { name = _getName; minTemp = _minTemp; maxTemp = _maxTemp; } //metod void Town::Stadsnamn() { if (minTemp < maxTemp) cout << getName() << "d"; else cout << getName() << "olika städer "; } //metod string som returnerar name string Town::getName() { return getNames(); }

Ändrat lite:
1: Avkommenterat 'string name'
2. Ändrat första raden i konstruktorn.

Men förstår inte hur du gör i funktionen getName. Var får du getNames() ifrån?
Edit: Borde det inte vara:
return name;

[AMD 64 Winchester 3500+][Asus A8R-VMP (skitkort!)][Kingmax 4x512MB ram][Hitachi 160G SATA][Sapphire X1950XTX 512MB DDR4 PCIe][Soundblaster X-Fi Platinum][Nesteq NA 4501 450W][Hyundai L90D+ 19]

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Ditt ursprungliga fel var ju att du försökte deklarera både en variabel och en metod med samma namn. I din konstruktor har du gått runt problemet med namnkonflikter genom att prefixa parametrarna med _, t.ex. _name. Jag brukar göra tvärtom istället, d.v.s. prefixa klassvariablerna med _, för att undvika konflikter med metodnamn. T.ex.:

class Town // Förenklad Town-klass som exempel. { public: Town(string name); string name(); // Metod som returnerar objektets namn. public: // Separat sektion för variabler, det blir lätt lite rörigt annars. string _name; // Variabel som innehåller objektets namn. }; Town::Town(string name) { _name = name; } string Town::name() { return _name; }

Egentligen bör variablerna placeras i en private-sektion så att de inte är åtkomliga utanför klassen, men det är väl en kommande lektion. Man bör också föredra att använda en initialiseringslista för att tilldela variablerna i konstruktorn:

Town::Town(string name, int minTemp, int maxTemp) : _name(name), _minTemp(minTemp), _maxTemp(maxTemp) { // Inget att göra här längre. }

Detta får väl också räknas som lite överkurs, men är något du behöver lära dig någon gång om du ska programmera C++. Här är en lite mer ingående guide till varför man bör använda initialiseringslistor istället för tilldelning.