Premiär! Fyndchans i SweClockers Månadens Drop
Permalänk

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?

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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.

Permalänk

@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; }

Permalänk

@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(); }

Permalänk
Medlem
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;

Visa signatur

[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]

Permalänk
Medlem

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.