Nybörjare i C++ behöver hjälp!

Permalänk

Nybörjare i C++ behöver hjälp!

Tjena behöver lite hjälp i c++ om någon vänlig själ kan förklara hur det funkar

Exempel 1 fungerar men inte Exempel 2.

Exempel 1

#include <iostream> using namespace std; void valueChanger(int y, int x,int *z); int main(){ int test = 10; cout << test << endl; valueChanger(5, test, &test); cout << test << endl; system ("PAUSE"); } void valueChanger(int y, int x, int *z ){ *z = x * y; }

10 50

Detta funkar som det ska men om jag vill ändra värdet på ett funktions värde så funkar det inte.

Exempel 2

#include <iostream> using namespace std; int value(); void valueChanger(int y, int x,int *z); int main(){ cout << value()<< endl; valueChanger(5, value(), &value()); cout << value() << endl; system ("PAUSE"); } int value(){ int test = 10; return test; } void valueChanger(int y, int x, int *z ){ *z = x * y; }

Tack på förhand!

Permalänk
Medlem

Man får inte göra sådär. Det går nästan att göra det du försöker göra såhär t.ex...

#include <iostream> using namespace std; template<class T> void valueChanger(int,T,T&); class Value { int value; public: Value(int a):value(a){} int getValue(){return value;} void operator=(int a){value=a;} int operator*(int a){return value*a;}; }; int main(){ Value val(10); int val2 = 10; cout << val.getValue() << endl; valueChanger(5, val, val); cout << val.getValue() << endl << "\n"; cout << val2 << endl; valueChanger(5, val2, val2); cout << val2 << endl; system ("PAUSE"); return 0; } template<class T> void valueChanger(int y, T x, T& val){ val = x * y; }

Dold text

Nu kan man använda valueChanger med både int och klassen Value. Om man inte vill ha en klass, utan istället en funktion:

#include <iostream> using namespace std; int value(); void value(int); void valueChanger(int, int, int&); void valueChanger(int, int, void(*)(int)); int main(){ int val = 10; cout << value() << endl; valueChanger(5, value(), value); cout << value() << endl << "\n"; cout << val << endl; valueChanger(5, val, val); cout << val << endl; system ("PAUSE"); return 0; } static int test = 10; int value() { return test; } void value(int y) { test = y; } void valueChanger(int y, int x, int& val){ val = x * y; } void valueChanger(int y, int x, void(*func)(int)){ func(x*y); }

Dold text

Går säkert att göra snyggare dock.

Ledorden är alltså: funktionspekare, templates, operator overload. Så du vet vad du ska söka på.

Permalänk
Medlem

Problemet här är att value() returnerar en int, ett heltalsvärde. I ditt fall returnerar value() värdet på test, dvs. 10. "Livstiden" på detta värde är dock endast själva användningen av värdet, dvs. det är ett temporärt värde. Om du skulle skriva t.ex.

int i = value();

så skulle value() först köras och returnera 10. Sedan kopieras detta till i, och därefter frigörs minnet som användes till att lagra returvärdet från value(). Detta är orsaken till att du inte får skriva &value(), eftersom du då försöker ta addressen på ett temporärt värde som inte kommer att existera efter att &value() exekverats.

Det går att lösa detta genom att returnera en referens eller pekare från value() istället, t.ex.

int& value() { int test = 10; return test; }

Detta är dock fortfarande fel, eftersom test endast existerar i funktionen. Dvs. när funktionen exekveras så kommer minne allokeras för test, en referens till test returneras, och sedan frigörs minnet för test. Du har nu en referens till en variabel som inte längre existerar, och en bra kompilator kommer att åtminstone ge dig en varning om detta.

Ett sätt att komma runt detta är att deklarera test som static (se t.ex. denna sida för en förklaring):

int& value() { static int test = 10; return test; }

static är lite klurigt i C++ eftersom det betyder olika saker beroende på vart det används, men när det används på detta sätt betyder det att test existerar under exekveringen av hela programmet istället för bara under exekveringen av funktionen.