Nybörjare i C++ behöver hjälp!
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;
}
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);
}
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å.
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.
- Igår Grafikprestanda i Senua's Saga: Hellblade II – ett av de tyngsta PC-spelen någonsin 45
- 19 / 5 Ghost of Tsushima kan använda DLSS och FSR 3 samtidigt 11
- 17 / 5 27 år senare – Winamp får öppen källkod 45
- 17 / 5 Grafikprestanda i Ghost of Tsushima – en välpolerad PC-version 28
- 17 / 5 Microsoft: Byt till Bing om du vill reparera din dator 39
- Uppgraderingspaket till sambo4
- Nyhetstips!481
- Dålig prestanda.4
- Samlingstråd LG OLED 2023 (A3/B3/C3/G3/Z3)766
- Wordle på svenska - ordlig.se7945
- Bra/okej inear som är billiga13
- 4080 Aero 110° hotspot - Garanti ärende1
- Noctua lanserar Home – fläktlösningar för hemmet47
- Surface-tangentbord med AI-knapp kostar 5 000 kronor29
- Moddat 4070 Ti Super snabbare än 4080 Super31
- Säljes Acer Predator XB323QK 32" IPS 144Hz 1ms
- Köpes Köper ditt 2080Ti el liknande
- Säljes Mäktig dator 7950X, RX 7900 XTX, 64 GB, 2x2TB 990 PRO, 1300W
- Säljes Speldator från komplett säljes
- Säljes Samsung Galaxy Watch5 LTE (44mm) grafit
- Skänkes Chassidelar och skrot skänkes kanske för test bench bygge?
- Säljes Linksys Velop WIFI 6 1-pack
- Säljes Speldator - i9-9900k, 3070, 16GB
- Säljes Bose Noise Cancelling Headphones 700
- Säljes 2 detskops Hp omen (3080) (1060)
- Sonos gör hörlursdebut med Sonos Ace27
- Grafikprestanda i Senua's Saga: Hellblade II – ett av de tyngsta PC-spelen någonsin45
- Surface-tangentbord med AI-knapp kostar 5 000 kronor29
- Noctua lanserar Home – fläktlösningar för hemmet47
- Microsoft visar upp Copilot Plus PC32
- Studenter hittar sårbarhet i tvättautomater – företaget ignorerar varningar19
- Se Windows XP infekteras på minuter utan skydd45
- Detta gäller när HBO Max blir Max82
- Delning av skadlig kod via PDF-filer ökar22
- SweClockers får efterlängtade forumfunktioner40
Externa nyheter
Spelnyheter från FZ
- Kingdom Hearts till Steam, efter tre års Epic-exklusivitet igår
- Se Microsofts AI-tjänst guida (en noob vid) Minecraft-spelande igår
- Embracer säljer Switch-utvecklaren Shiver till Nintendo igår
- CoD till Game Pass innebär "förändrad" Game Pass-modell, påstås det igår
- Take-Two är "väldigt säkra" på GTA 6:s släppfönster igår