Permalänk

get set c++

Försöker mig på get set, men får detta felmeddelande error: declaration is incomplete with std::string Vehicle ::getBilMerke.

Kan skapa objekt så de funkar men just get set som inte fungerar. Jag vet inte riktigt vad get set kommer hjälpa mig men behöver träna på det så om någon kan reda ut det så skulle de varit hjälpsamt

#include "Vehicle.h" #include <sstream> #include <string> std::string Vehicle::getBilMarke() // här får jag fel { } std::string Vehicle::toString() { std::ostringstream t; t << "Bilmärke: " << this->bilMerke << std::endl << "Årsmodell: " << this->arsModell << std::endl << "Bränsletyp: " << this->bransletyp << std::endl << "Antal hjul: " << this->antalHjul << std::endl << "Vikt: " << this->vikt << std::endl; return t.str(); } Vehicle::Vehicle(std::string bilMerke, int arsModell, std::string bransleTyp, int antalHjul, int vikt) { this->bilMerke = bilMerke; this->arsModell = arsModell; this->bransletyp = bransleTyp; this->antalHjul = antalHjul; this->vikt = vikt; } Vehicle::~Vehicle() { }

#ifndef VEHICLE_H #define VEHICLE_H #include <string> class Vehicle { private: std::string bilMerke; int arsModell; std::string bransletyp; int antalHjul; int vikt; Vehicle(); public: std::string toString(); Vehicle(std::string bilMärke, int årsModell, std::string bränsleTyp, int antalHjul, int vikt); std::string getBilMarke; bool setBilMärke(std::string marke); int getArsModell; bool setÅrsModell(int Ar); std::string getBrAnsleTyp; bool setBränseTyp(std::string bransle); int getAntalHjul; bool setAntalHjul(int hjul); int getVikt; bool setVikt(int vikten); ~Vehicle(); }; #endif

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Hedersmedlem
Skrivet av turbogeten:

std::string getBilMarke;

Här borde du nog avsluta med parenteser; annars blir det en variabel.

Permalänk
Skrivet av Elgot:

Här borde du nog avsluta med parenteser; annars blir det en variabel.

Du är bäst! har nästan slitit av håret för jag inte hittat vad som är fel

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Medlem

Funkar verkligen å/ä/ö som variabel och funktionsnamn i c++? Sedan blandar du hej vilt mellan olika varianter Märke/Marke/Merke etc. Ett hett tips är att vänja dig vid att skriva allt på engelska, både kommentarer och kod, då slipper du alla sådana problem.

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Medlem

Ska ge dig 4 handgripliga tips för set/get

class Vehicle { public: // 1. initiera medlemsvariabler i konstruktorns initieringslista Vehicle() : _model("") {} // 2. använd const referens på argument till set, detta ger snabba anrop och skyddar innehållet i argumenten // (undantag för primitiva datatyper där du gör pass by value som vanligt) void setModel(const std::string& model) { _model = model; } // 3. a) använd const på get, då får du kompileringsfel om du försöker modifiera klassvariabler här // b) att returnera stora saker är ok p.g.a move construktorn i c++11 (överkurs, men lita på mig tills vidare) std::string getModel() const { return _model; } private: // 4. använd _ för medlemsvariabler, då slipper du använda this-> för att lösa namngivningsproblem std::string _model; };

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Skrivet av sunefred:

Ska ge dig 4 handgripliga tips för set/get

class Vehicle { public: // 1. initiera medlemsvariabler i konstruktorns initieringslista Vehicle() : _model("") {} // 2. använd const referens på argument till set, detta ger snabba anrop och skyddar innehållet i argumenten // (undantag för primitiva datatyper där du gör pass by value som vanligt) void setModel(const std::string& model) { _model = model; } // 3. a) använd const på get, då får du kompileringsfel om du försöker modifiera klassvariabler här // b) att returnera stora saker är ok p.g.a move construktorn i c++11 (överkurs, men lita på mig tills vidare) std::string getModel() const { return _model; } private: // 4. använd _ för medlemsvariabler, då slipper du använda this-> för att lösa namngivningsproblem std::string _model; };

Jag undrar en sak med min kod, så som jag har koden nu så verkar inte get set göra något över huvudtaget. Jag kan kommentara bort mina get set och den skriver fortfarande ut mitt mitt objekt trots att jag använder min getBilMerke() för att ta hämta. Så vad är det som går fel.

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Medlem
Skrivet av turbogeten:

Jag undrar en sak med min kod, så som jag har koden nu så verkar inte get set göra något över huvudtaget. Jag kan kommentara bort mina get set och den skriver fortfarande ut mitt mitt objekt trots att jag använder min getBilMerke() för att ta hämta. Så vad är det som går fel.

Det finns ett antal konstigheter i din kod, men om du vill kan vi ta dem en i taget.

std::string Vehicle::getBilMarke() // här får jag fel { }

Denna kod returnerar ingenting. Du har deklarerat att den ska returnera en std::string, men funktions-kroppen är tom. Tänkt till vad du vill returnera här, du kan ta ledning av mitt exempel. Du säger att du får ut värden av getBilMarke() även om du tar bort den, det är en omöjlighet! Du kan inte anropa en funktion som inte finns. Att det ändå existerar värden i din medlemsvariabel för bilMarke beror på att du initierar den i din konstruktor.

Jag får en känsla av att du är van med c# eftersom du deklarerat dina get/set utan att de gör någonting. Kan det stämma?

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere

Permalänk
Skrivet av sunefred:

Det finns ett antal konstigheter i din kod, men om du vill kan vi ta dem en i taget.

std::string Vehicle::getBilMarke() // här får jag fel { }

Denna kod returnerar ingenting. Du har deklarerat att den ska returnera en std::string, men funktions-kroppen är tom. Tänkt till vad du vill returnera här, du kan ta ledning av mitt exempel. Du säger att du får ut värden av getBilMarke() även om du tar bort den, det är en omöjlighet! Du kan inte anropa en funktion som inte finns. Att det ändå existerar värden i din medlemsvariabel för bilMarke beror på att du initierar den i din konstruktor.

Jag får en känsla av att du är van med c# eftersom du deklarerat dina get/set utan att de gör någonting. Kan det stämma?

Japp stämmer börja programmera i c#. Ska visa lite kod hur jag har gjort.

cpp-fil

#include "Vehicle.h" #include <sstream> #include <string> bool Vehicle::setBilMerke(std::string marke) { /* bool ok = true; //här kan jag kommentera bort hela min set o bara returna 0 och fortfarande skriver den ut mitt objekt if (marke != "") _bilMerke = marke; else ok = false; return ok; */ return 0; } std::string Vehicle::getBilMerke() const { return _bilMerke; } std::string Vehicle::toString() { std::ostringstream t; t << "Bilmärke: " << getBilMerke() << std::endl // här jag kallar på min get, tror jag fått det att fungera bara genom min get set nu. << "Årsmodell: " << _arsModell << std::endl << "Bränsletyp: " << _bransletyp << std::endl << "Antal hjul: " << _antalHjul << std::endl << "Vikt: " << _vikt << std::endl; return t.str(); } Vehicle::Vehicle(std::string bilMerke, int arsModell, std::string bransleTyp, int antalHjul, int vikt) { _bilMerke = bilMerke; _arsModell = arsModell; _bransletyp = bransleTyp; _antalHjul = antalHjul; _vikt = vikt; } Vehicle::~Vehicle() { }

H-fil

#ifndef VEHICLE_H #define VEHICLE_H #include <string> class Vehicle { private: std::string _bilMerke; int _arsModell; std::string _bransletyp; int _antalHjul; int _vikt; Vehicle(); public: std::string toString(); Vehicle(std::string bilMerke, int arsModell, std::string bransleTyp, int antalHjul, int vikt); std::string getBilMerke() const; bool setBilMerke(const std::string marke); int getArsModell() const; bool setÅrsModell(int Ar); std::string getBrAnsleTyp() const; bool setBränseTyp(const std::string bransle); int getAntalHjul() const; bool setAntalHjul(const int hjul); int getVikt() const; bool setVikt(int vikten); ~Vehicle(); }; #endif

main-fil

#include <iostream> #include "Vehicle.h" using namespace std; int main() { Vehicle fordon("Ford ", 1900, "Bensin ", 4, 50000); cout << fordon.toString(); getc(stdin); getchar(); }

Om du kolla i min kod där jag kommenterat bort min set så fungerar min kod o skriver ut rätt namn på bilmärke. Så det känns inte som min get set är nödvändig för koden fungerar utan den ändå.

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Medlem
Skrivet av turbogeten:

Om du kolla i min kod där jag kommenterat bort min set så fungerar min kod o skriver ut rätt namn på bilmärke. Så det känns inte som min get set är nödvändig för koden fungerar utan den ändå.

Det stämmer, i ditt exempel behövs inte set eftersom du sätter alla medlemsvariablierna genom din konstruktor. Vidare behövs inte get eftersom den enda interaktionen du har med klassen är genom toString(). Föreställ dig nu att du behöver hålla reda på hur långt bilen har kört, detta ändras ju med tiden, så det räcker inte med att initiera den i konstruktorn. Det är lätt att tänka ut fler exempel där du behöver åtkomst till medlemsvariabler utifrån klassen, och detta bör du göra genom set/get på det viset som jag visade i mitt tidigare exempel.

Vad gäller c# så finns där konceptet properties, som ju inte finns i C++. Om du tittar på den fulla versionen av property i C#, så skrivar man t.ex.

class Person { private string name; // the name field public string Name // the Name property { get { return name; } set { name = value; } } }

Du har alltså ett backing field som heter name och en property som heter Name. Du kan även skriva en kort version

class Person { public string Name { get; set; } }

När c# kompileraren ser en sådan version skapar den automatiskt ett anonymt backing field åt dig. Den är alltså ekvivalent med den långa versionen, med undantag av att du inte har direkt åtkomst till denna backing field.

Någon motsvarande kort version finns inte i C++. Jag tror en del av din förvirring kommer från detta faktum. Du måste själv skapa en privat medlemsvariabel för att lagra din information, och åtkomst gör du bäst genom funktioner (set/get) p.g.a. inkapslingsprincipen.

class Person { public: setName(const std::string& name) { _name = name; } std::stirng getName() const { return _name; } private: std::string _name; };

Visa signatur

Louqe Ghost S1 MK3 | Asus ROG Strix B660-I Gaming WiFi | Intel Core i7 12700K | nVidia RTX 2070 Super FE | Corsair 64GB (2x32GB) DDR5 5600MHz CL40 Vengeance | Samsung 980 PRO M.2 NVMe SSD 2TB | Corsair SF750 750W 80+ Platinum | Noctua NH-L12 Ghost S1 edition | Kablar från pslate customs | 2 stk Dell Ultrasharp 3014 | Logitech MX Keys | Logitech MX Anywhere