App installieren
How to install the app on iOS
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
[c/c++] Spaghetti code?
- Ersteller Hannnibal
- Erstellt am
Moin,
ich hab das problem das eine member variable einer klasse erst "int" ist und im späteren Programmverlauf "double" seien muß...
1. Möglichkeit die mir in den sinn kam: Klasse ableiten...member überladen...
Klappte aber irgendwie nicht .
2. Eine Status variable welche angibt was meine variable gerade ist (integer oder double)
Variable wird void zeiger...
Das ist dabei rausgekommen
In der Header:
dazugehörigen CPP
Im spätern Programmcode...
Lesender zugriff
Für schreiben denke ich mir auch noch was aus...
Funktioniert das überhaupt (zuverlässig) so?
Wann gehen mir die normalen variablen kaputt? (also zb das übergebene gr im constructor...)
Gibt es ein besser Lösung...?
Wie sieht die bug gefahr dabei aus? Noch vertretbar oder absoluter murks...?
Sollte ich lieber float anstatt double nehmen? (integer 32bit/ double 64) oder ist das egal...
mfg
ich hab das problem das eine member variable einer klasse erst "int" ist und im späteren Programmverlauf "double" seien muß...
1. Möglichkeit die mir in den sinn kam: Klasse ableiten...member überladen...
Klappte aber irgendwie nicht .
2. Eine Status variable welche angibt was meine variable gerade ist (integer oder double)
Variable wird void zeiger...
Das ist dabei rausgekommen
In der Header:
Code:
protected:
bool doubleGr;
void* ptrGroesse;
Code:
MessDatum::MessDatum(double gr, float gw) {
ptrGroesse=&gr;
gewicht=gw;
doubleGr=false;
}
MessDatum::MessDatum(double gr, float gw) {
ptrGroesse=&gr;
gewicht=gw;
doubleGr=true;
Lesender zugriff
Code:
if (doubleGr) double groesse = *((double*)ptrGroesse);
else int groesse = *((int*)ptrGroesse);
Funktioniert das überhaupt (zuverlässig) so?
Wann gehen mir die normalen variablen kaputt? (also zb das übergebene gr im constructor...)
Gibt es ein besser Lösung...?
Wie sieht die bug gefahr dabei aus? Noch vertretbar oder absoluter murks...?
Sollte ich lieber float anstatt double nehmen? (integer 32bit/ double 64) oder ist das egal...
mfg
Zuletzt bearbeitet:
Ray
Grand Admiral Special
- Mitglied seit
- 11.11.2001
- Beiträge
- 3.141
- Renomée
- 20
- Standort
- An der Spree
- Mein Laptop
- Kein Notbuch
- Prozessor
- Intel Core2Quad Q9650@3.8, AMD Ryzen 9 under test
- Mainboard
- DFI LANPARTY LT X48-T2R + MIPS DFI LANparty P35/X38/X48 Series Freezer Set Nickel
- Kühlung
- EK-Supreme
- Speicher
- 4 x 2 GB OCZ PC2 8500 C5 Reaper@500
- Grafikprozessor
- XFX 8800 GTS(G92) 512 + EK-FC8800 GT/GTS(g92)
- Display
- TFT HP w2408h, 1920x1200
- SSD
- Samsung 840 Pro 256 GB
- HDD
- 2 x WD Black 1TB
- Optisches Laufwerk
- Samsung SH-D163A, Samsung SH-S183A
- Soundkarte
- Creative X-FI Xtreme Gamer Fatality Pro
- Gehäuse
- Modified Lian Li PC201B
- Netzteil
- Seasonic S12 550W
- Betriebssystem
- Win7U-64
- Webbrowser
- FireFox
- Verschiedenes
- Thermochill PA120.3 Triple Radiator , Liang DDC , 11 years old mainboard, still running!
Spontan fällt mir der Einsatz von Templates ein, aber das hilft Dir ja auch nicht, da Du innerhalb einer Klasse den Typ am lebenden Objekt ändern willst.
Aber klassisch kann so ein Problem mit union und einem Tag gelöst werden. Ist ähnlich wie Deine Lösung, aber etwas sauberer und es wird auf Pointer verzichtet:
Benützung:
Es lässt sich bei get_xxx() noch ein Check einbauen, welcher sicherstellt, daß zum Type der richtige Tag eingestellt ist.
So sinngemäß ist das im Bjarne Stroustrup beschrieben.
Ciao,
Ray
Aber klassisch kann so ein Problem mit union und einem Tag gelöst werden. Ist ähnlich wie Deine Lösung, aber etwas sauberer und es wird auf Pointer verzichtet:
Code:
class use_var {
public:
enum eTag { USE_INT, USE_DOUBLE };
private:
union { int i; double d; };
eTag tag;
public:
eTag get_tag() { return tag };
use_var(int ii) { i = ii; tag = USE_INT; }
use_var(double dd) { d = dd; tag = USE_DOUBLE; }
int& get_int() { return i; }
double& get_double() { return d; }
};
Benützung:
Code:
use_var val(0.5);
...
if (val.get_tag() == USE_DOUBLE)
double groesse = val.get_double();
else
int groesse = val.get_int();
...
So sinngemäß ist das im Bjarne Stroustrup beschrieben.
Ciao,
Ray
Zuletzt bearbeitet:
Moin,
super tip , ist wirklich schöner diese methode...
Allerdings ist ein problem geblieben.
Die Variable groesse wird im if else block declariert....leider meckert der compiler das ihm die variable im weiteren programmablauf unbekannt vorkommt .
Da muß ich wohl doch wieder auf pionter umschwenken .
Oder gibt es die möglichkeit eine int groesse außerhalb des blocks zu deklarieren und im block umzupolen?
mfg
super tip , ist wirklich schöner diese methode...
Allerdings ist ein problem geblieben.
Die Variable groesse wird im if else block declariert....leider meckert der compiler das ihm die variable im weiteren programmablauf unbekannt vorkommt .
Da muß ich wohl doch wieder auf pionter umschwenken .
Oder gibt es die möglichkeit eine int groesse außerhalb des blocks zu deklarieren und im block umzupolen?
mfg
PuckPoltergeist
Grand Admiral Special
Also so richtig verstehe ich dein Problem noch nicht. Du kannst doch einem double einfach ein int-Wert zuweisen.
Moin Puck,
Die groesse wird aber später im bereich von 1.xx-2.xx leigen (normiert sogar nur von 0.xx-1).
da macht int zuweisung nicht richtig spass...
Ich werde es so machen das in dem zweig wo ich festelle ob es eine double oder int ist dierekt mit dem restlichen prozeduren weiter mache...das verdoppelt zwar den code, aber was solls .
Es kann durchaus sein das ich es mir komplizierter mache als nötig , aber nach dem conzept wird jetzt implementiert...
mfg
Die groesse wird aber später im bereich von 1.xx-2.xx leigen (normiert sogar nur von 0.xx-1).
da macht int zuweisung nicht richtig spass...
Ich werde es so machen das in dem zweig wo ich festelle ob es eine double oder int ist dierekt mit dem restlichen prozeduren weiter mache...das verdoppelt zwar den code, aber was solls .
Es kann durchaus sein das ich es mir komplizierter mache als nötig , aber nach dem conzept wird jetzt implementiert...
mfg
Zuletzt bearbeitet:
Moin,
es geht darum das man in dem programm gezielt mit integer rechnet und später auf Floating piont umstellt, es sollen die Mess Fehler bzw Fehler die aus der datenhaltung resultieren dargestellt werden.
So klappt des ganz gut...
mfg
es geht darum das man in dem programm gezielt mit integer rechnet und später auf Floating piont umstellt, es sollen die Mess Fehler bzw Fehler die aus der datenhaltung resultieren dargestellt werden.
So klappt des ganz gut...
mfg
Das kannst du doch schon mit C recht angenehm per union lösen.
Schöner wäre natürlich, wenn du darum eine Klasse mit überladenem cast bastelst - per Befehl kannst du dann umschalten, dass er intern statt integer doch double nehmen soll, nach 'draußen' ändert sich ja dann nix.
Oder eben das einfachste - du macht da wo du integer brauchst immer einen cast nach integer.
EDIT
@Ray
Hast meine Lösung natürlich schon gepostet . Allerdings fehlt noch der cast .
Also ungefähr so hier:
So könnte man zB. auch komplett den Variant implementieren, auf dem die VB-Extremisten immer so rumreiten.
Schöner wäre natürlich, wenn du darum eine Klasse mit überladenem cast bastelst - per Befehl kannst du dann umschalten, dass er intern statt integer doch double nehmen soll, nach 'draußen' ändert sich ja dann nix.
Oder eben das einfachste - du macht da wo du integer brauchst immer einen cast nach integer.
EDIT
@Ray
Hast meine Lösung natürlich schon gepostet . Allerdings fehlt noch der cast .
Also ungefähr so hier:
Code:
class variant
{
public:
operator int();
operator double();
int operator=(variant value);
int operator=(int value);
int operator=(double value);
void switch_int();
void switch_double();
};
So könnte man zB. auch komplett den Variant implementieren, auf dem die VB-Extremisten immer so rumreiten.
Zuletzt bearbeitet:
Ähnliche Themen
- Antworten
- 0
- Aufrufe
- 134K