Trädvy Permalänk
Medlem
Plats
skell
Registrerad
Okt 2008

Hjälp med c++, klasser.

Hej! Jag har fått en skoluppgift där jag ska göra en enkel godisautomat. Den ska inte ta pengar utan bara visa antal varor och låta användaren ta ut varor. Det ser ut såhär

main

#include <iostream> #include "automatVara.h" using namespace std; void sell(automatVara&); void menu(); int main() { automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6); menu(); int choice; cin >> choice; while (choice != 9) { switch (choice) { case 1: sell(Japp); break; case 2: sell(Snickers); break; case 3: sell(Twix); break; case 4: sell(Dajm); break; default: cout << "Välj mellan 1, 2, 3 och 4" << endl; break; } menu(); cin >> choice; } return 0; } void menu() { cout << "Lucka nr 1: Japp. Antal:" << endl; cout << "Lucka nr 2: Snickers. Antal:" << endl; cout << "Lucka nr 3: Twix. Antal:" << endl; cout << "Lucka nr 4: Dajm. Antal:" << endl; cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; } void sell(automatVara& produkt) { if (produkt.HamtaAntalVaror() > 0) { produkt.makeSale(); cout << "Varsegod!" << endl; } else cout << "Den varan är slut" << endl; }

automatVara.h

class automatVara { public: int HamtaAntalVaror (); void makeSale (); private: int antalVaror; };

automatVara.cpp

#include <iostream> #include "automatVara.h" using namespace std; int automatVara::HamtaAntalVaror() { return antalVaror; } void automatVara::makeSale() { antalVaror--; }

Når inte main fram till klassen eller? Uppskattar all hjälp på vägen ni kan ge!

||=== Build: Debug in Godisautomat (compiler: GNU GCC Compiler) ===| D:\programmering\Godisautomat\main.cpp||In function 'int main()':| D:\programmering\Godisautomat\main.cpp|10|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|10|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| D:\programmering\Godisautomat\main.cpp|11|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|11|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| D:\programmering\Godisautomat\main.cpp|12|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|12|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| D:\programmering\Godisautomat\main.cpp|13|error: no matching function for call to 'automatVara::automatVara(int)'| D:\programmering\Godisautomat\main.cpp|13|note: candidates are:| include\automatVara.h|1|note: automatVara::automatVara()| include\automatVara.h|1|note: candidate expects 0 arguments, 1 provided| include\automatVara.h|1|note: automatVara::automatVara(const automatVara&)| include\automatVara.h|1|note: no known conversion for argument 1 from 'int' to 'const automatVara&'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Jul 2011

Nu var det ju länge sen jag satt med C++, men det kan inte vara att du först definierat automatVara& och sen automatVara? Att den inte hittar den variabeln därav?

Gigabyte GA-Z77X-UP7 | i7 3770K 3.5 GHz | Crucial Ballistix Elite DDR3 1600 MHz 4x4 GB | Crucial M500 240GB SSD | Seagate Desktop 3TB 7200rpm 64MB | Corsair H80i | Gigabyte GTX 970 Windforce G1 Gaming 4GB SLI | BitFenix Ronin | Be-Quiet Dark Power Pro 10 750 W | Asus Xonar Essence STX
Inet Fraktfritt

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Jul 2011

Annars har du en bra hemsida här som kan hjälpa till med det mesta: http://www.cplusplus.com/

Gigabyte GA-Z77X-UP7 | i7 3770K 3.5 GHz | Crucial Ballistix Elite DDR3 1600 MHz 4x4 GB | Crucial M500 240GB SSD | Seagate Desktop 3TB 7200rpm 64MB | Corsair H80i | Gigabyte GTX 970 Windforce G1 Gaming 4GB SLI | BitFenix Ronin | Be-Quiet Dark Power Pro 10 750 W | Asus Xonar Essence STX
Inet Fraktfritt

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Du behöver definiera en "constructor" i klassen "automatVara". Du kan läsa om det en liten bit ner på denna sidan: http://www.cplusplus.com/doc/tutorial/classes/

Edit: Gissningsvis vill du göra något i stil med:

automatVara.h

class automatVara { public: automatVara(int); int HamtaAntalVaror (); void makeSale (); private: int antalVaror; };

automatVara.cpp

#include <iostream> #include "automatVara.h" using namespace std; automatVara::automatVara(int antal){ antalVaror=antal; } int automatVara::HamtaAntalVaror() { return antalVaror; } void automatVara::makeSale() { antalVaror--; }

Bytt ut [\code] mot [/code]
Trädvy Permalänk
Medlem
Registrerad
Jun 2014

Vad dessa sa. Anrop på rad 10, 11, 12 samt 13 i main.cpp tar inte de argumenten

Trädvy Permalänk
Medlem
Plats
skell
Registrerad
Okt 2008

Tackar för hjälpen! ska kika på länken du skicka!

Trädvy Permalänk
Medlem
Plats
skell
Registrerad
Okt 2008

Nu fungerar det som det ska. Men skulle jag kunna baka in

automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6);

i typ en funktion? Är det ful kodning att låta det vara där det är? nådde inte ut hämtaantalvaror i menyn när jag hade det liggandes i main, därför flyttade jag upp den.

#include <iostream> #include "automatVara.h" using namespace std; automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6); void salj(automatVara&); void meny(); int main() { meny(); int choice; cin >> choice; while (choice != 9) { switch (choice) { case 1: salj(Japp); break; case 2: salj(Snickers); break; case 3: salj(Twix); break; case 4: salj(Dajm); break; default: cout << "Välj mellan 1, 2, 3, 4 och 9 för att avsluta" << endl; break; } meny(); cin >> choice; } return 0; } void meny() { cout << "Lucka nr 1: Japp. Antal:" << Japp.HamtaAntalVaror() << endl; cout << "Lucka nr 2: Snickers. Antal:" << Snickers.HamtaAntalVaror() << endl; cout << "Lucka nr 3: Twix. Antal:" << Twix.HamtaAntalVaror() << endl; cout << "Lucka nr 4: Dajm. Antal:" << Dajm.HamtaAntalVaror() << endl; cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; } void salj(automatVara& produkt) { if (produkt.HamtaAntalVaror() > 0) { produkt.saljVara(); cout << "Varsegod!" << endl; } else cout << "Den varan är slut" << endl; }

automatVara.cpp

#include <iostream> #include "automatVara.h" using namespace std; automatVara::automatVara(int antal){ antalVaror=antal; } int automatVara::HamtaAntalVaror() { return antalVaror; } void automatVara::saljVara() { antalVaror--; }

automatVara.h

class automatVara { public: automatVara(int); int HamtaAntalVaror (); void saljVara (); private: int antalVaror; };

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

Nu fungerar det som det ska. Men skulle jag kunna baka in

automatVara Japp(5); automatVara Snickers(4); automatVara Twix(3); automatVara Dajm(6);

i typ en funktion? Är det ful kodning att låta det vara där det är? nådde inte ut hämtaantalvaror i menyn när jag hade det liggandes i main, därför flyttade jag upp den.

I regel brukar man försöka undvika globala variabler i C++, eftersom det kan vara svårt att få en översikt över hur de används i mer komplicerade program. Man kan också få en del problem med initialisering och annat. Men i såna här små skoluppgifter kan det bli onödigt komplicerat att undvika globala variabler.

Ett sätt att undvika globala variabler är att helt enkelt skicka runt variablerna till funktionerna de används i. Det enklaste skulle alltså vara att ändra meny till att ta variablerna som argument:

void meny(automatVara &Japp, automatVara &Snickers, automatVara &Twix, automatVara &Dajm) { cout << "Lucka nr 1: Japp. Antal:" << Japp.HamtaAntalVaror() << endl; cout << "Lucka nr 2: Snickers. Antal:" << Snickers.HamtaAntalVaror() << endl; cout << "Lucka nr 3: Twix. Antal:" << Twix.HamtaAntalVaror() << endl; cout << "Lucka nr 4: Dajm. Antal:" << Dajm.HamtaAntalVaror() << endl; cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; }

Men den lösningen skalar ju inte särskilt bra, varje gång du vill ändra antalet varor så måste du ändra meny-funktionen. En bättre lösning skulle vara att lagra varorna i en array eller vector och skicka in den istället, t.ex.:

void meny(const std::vector<automatVara> &varor) { for(int i = 0; i < varor.size(); ++i) { cout << "Lucka nr " << i + 1 << varor[i].Namn() << ". Antal:" << varor[i].HamtaAntalVaror() << endl; } cout << "Skriv in numret på varan du vill ha, avsluta med 9" << endl; }

Detta förutsätter att klassen automatVara har en metod Namn som helt enkelt returnerar varans namn. Vectorn kan sedan skapas i t.ex. main:

std::vector<automatVara> varor; varor.push_back(automatVara("Japp", 5)); varor.push_back(automatVara("Snickers", 4)); ...

Beroende på hur långt du kommit med C++ så kan det här vara lite överkurs dock. För en enkel skoluppgift är din lösning helt ok.

Trädvy Permalänk
Medlem
Plats
skell
Registrerad
Okt 2008

Tack för ett bra svar!