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 27 år senare – Winamp får öppen källkod 31
- Igår Grafikprestanda i Ghost of Tsushima – en välpolerad PC-version 16
- Igår Microsoft: Byt till Bing om du vill reparera din dator 28
- Igår Grand Theft Auto VI släpps hösten 2025 26
- 16 / 5 IOS 17.5 återställer raderade bilder – även på nollställda enheter 52
- THICC Q60 vattenkylare.0
- I just found out this ONE SETTING is LOWERING your FPS...0
- Gräva ner TP kabel41
- Tips på bra kökskniv för kött som kan slipas bra, under 500 kr...15
- 27 år senare – Winamp får öppen källkod31
- Nu är Twitter officiellt X.com36
- Wordle på svenska - ordlig.se7932
- Så ska bankerna ta hårdare tag mot bedragare61
- TV-guiden 2023/24 – diskussionstråden641
- Tele 2 TV Flexibel - En review av tjänsten efter 6 månaders användning11
- Säljes PS4 500GB
- Säljes GeForce RTX 3080 Ti
- Köpes Mobil till dottern för Roblox etc
- Säljes IPhone 13 128gb
- Säljes ASUS ROG Swift 27" (PG279Q)
- Säljes MSI GeForce GTX 980 Ti Gaming
- Säljes PNY GeForce RTX 4090 Gaming VERTO EPIC-X + Corsair 12VHPWR-kabel
- Säljes Intressekoll 7700x 4090
- Säljes Helt nytt keychron v6 nordic full-size volume knob med brown/silver switchar samt iceberg dye-sub pbt keycaps
- Bytes Söker Logitech G Pro har lite att erbjuda
- 27 år senare – Winamp får öppen källkod31
- Grafikprestanda i Ghost of Tsushima – en välpolerad PC-version16
- Microsoft: Byt till Bing om du vill reparera din dator28
- Nu är Twitter officiellt X.com36
- Var med och tyck till SweClockers mobilupplevelse!24
- Grand Theft Auto VI släpps hösten 202526
- Socialdemokraterna vill införa ID-krav på sociala medier233
- Bank ID slutar fungera på äldre Apple-enheter48
- EU utreder om Instagram är skadligt för barn53
- IOS 17.5 återställer raderade bilder – även på nollställda enheter52