zeigertyp zur laufzeit ändern?
-
tenim schrieb:
deine überhebliche art kannst du dir sparen. du bist nicht der einzige, der programmieren kann. ich bin bestimmt kein c++ crack, aber ich machs ja erst seit 2 tagen i n c++.
Das hat mit Überheblichkeit nix zu tun.
In C++ macht man solche Sachen mit new und delete, egal was du früher gemacht hast. Denn mit new und delete bist du auf der sicheren Seite. Insbesondere wenn deine Klassen mal komplexer werden, oder du die Strukturen verändern willst und dabei ein Objekt mal gerade nicht seine 4 Byte groß ist, dann geht das Gefrickel los. Nimm dir doch einfach die Zeit und lies ein Buch, bevor du dir aus deinem (C-)Hintergrund heraus schlechten Stil angewöhnst.
-
ok, aber ob ich es mit malloc oder new mache ist doch relativ egal da ich in beiden fällen darauf achten muss, die ressourcen manuell wieder freizugeben.
wenn ich wegen der operandengrösse nicht sicher bin, kann ich ja sizeof() nehmen.ich hab ja malloc nicht ohne triftigen gund angewandt. es ging darum, ein array von n objektreferenzen anzulegen, OHNE die objekte selbst alle auf einmal zu instanzieren. wenn du mir erklärst, wie ich das mit "new" hinkriege, bitte.
-
tenim schrieb:
ich hab ja malloc nicht ohne triftigen gund angewandt. es ging darum, ein array von n objektreferenzen anzulegen, OHNE die objekte selbst alle auf einmal zu instanzieren. wenn du mir erklärst, wie ich das mit "new" hinkriege, bitte.
Aber du hast ihn ja sofort danach zugewiesen. Da hättest du auch new nehmen können. Und da das ganze Anwendungscode ist, würde ich das auch in einen Smart Pointer packen. Dann hast du die volle flexibiltät und musst dir keine Sorgen um die Speicherverwaltung machen..
Und wenn es denn wirklich sein muss, dann würde ich auf vorgefertige Funktionalitäten zurückgreifen und mir einen anständigen Wrapper schreiben und nicht einfach drauflos programmieren..
http://www.cplusplus.com/reference/std/memory/
http://www.cplusplus.com/reference/std/new/
-
nein, ich erstell jede objektinstanz mit anderen parametern. deshalb kann ich nicht alles in einem rutsch machen.
-
tenim schrieb:
nein, ich erstell jede objektinstanz mit anderen parametern. deshalb kann ich nicht alles in einem rutsch machen.
OK. Das sieht man aber in deinem Beispiel nicht..
Wie auch immer wäre das alleine für mich noch lange kein Grund malloc oder auch nur new zu benutzen. Ich würde vorher einen Standardcontainer nehmen und da die Elemente pushen und das kannst du für jedes Element andere Parameter übergeben.
Und wenn ich das aus irgendeinem Grund nicht machen kann/will, dann würde ich sogar vorher einfach die Elemente erzeugen (mit dem Standardkonstruktor) und dann über einen setter die Werte setzen.
Aber wenn du das unbbedingt mit malloc machen willst..
-
tenim schrieb:
hey mr. "drakon"
ich habs in meinem letzten post bereits mit malloc gemacht.
deine überhebliche art kannst du dir sparen. du bist nicht der einzige, der programmieren kann. ich bin bestimmt kein c++ crack, aber ich machs ja erst seit 2 tagen i n c++.Du scheinst ja nicht gerade sehr kritikfähig zu sein. Dravere und drakon haben völlig Recht mit ihren Einwänden.
Wenn du aus C kommst, kannst du innerhalb von 2 Tagen noch kein C++. Die Konzepte sind grundlegend anders, manuelle Speicherverwaltung kann auf ein Minimum reduziert werden. Das heisst, dass du meistens weder mit
malloc()noch mitnewhantieren musst, sondern fertige Container der STL anwenden kannst.Dann hast du
std::vector<MyClass> Vec; Vec.push_back(MyClass(25, "x25-b77", true));Das ist doch wohl schöner als jegliches Rumgefrickel mit
malloc().- Wie willst du mit
malloc()Konstruktoren aufrufen, ohne Placement New einzusetzen? - Was, wenn du plötzlich ein Element anhängen willst, und der Speicher nicht mehr reserviert ist?
- Hast du Kopierkonstruktor und Zuweisungsoperatoren überladen oder wenigstens
privategemacht? - Rufst du vor dem Freigeben mit
free()die Destruktoren auf? - Hast du eine separate Variable für die Grösse des dynamischen Arrays, die auch ständig aktualisiert wird?
- Wie willst du mit
malloc()effizient debuggen? Bei den STL-Containern erhält man Assertions. - Was ist, wenn du plötzlich merkst, dass ein dynamisches Array doch nicht die richtige Datenstruktur ist und statt dessen eine verkettete Liste angebracht wäre?
Alle diese Probleme hast du mit STL-Containern nicht. Zudem hast du damit sauberen, übersichtlichen und somit gut wartbaren Code. Die Fehleranfälligkeit und allfällige Memory Leaks fallen praktisch weg.
- Wie willst du mit
-
nein, ich komme nicht unbedingt aus der c ecke. hab zwar in c einige zeit programmiert, aber mehr mit java(hab ich auch in einem posting geschrieben, liest halt keiner richtig).
und kritikfähig bin ich schon, das kannst du mir glauben. nur der ton macht die musik und es ist oft wichtiger, wie jemand etwas sangt, als was er sagt.
und der umgangston war einfach unhöflich. das erkennen viele leute nicht, weil sie einfach zu tief in ihrer materie drin sind und darauf keinen wert legen.ich allerdings schon.
-
tenim schrieb:
nein, ich komme nicht unbedingt aus der c ecke. hab zwar in c einige zeit programmiert, aber mehr mit java(hab ich auch in einem posting geschrieben, liest halt keiner richtig).
Hm, während des Threadverlaufs hatte ich irgendwie das Gefühl bekommen, du seist aus C. Wie auch immer,
malloc()undfree()sind C und haben bis auf einige Ausnahmen nichts in C++ zu suchen (nein, dein Fall ist keine solche Ausnahme).tenim schrieb:
und kritikfähig bin ich schon, das kannst du mir glauben. nur der ton macht die musik und es ist oft wichtiger, wie jemand etwas sangt, als was er sagt.
und der umgangston war einfach unhöflich. das erkennen viele leute nicht, weil sie einfach zu tief in ihrer materie drin sind und darauf keinen wert legen.Es wird auch nicht gerade besonders geschätzt, wenn man als Fragesteller nicht auf die Antworten eingeht. Es wurden viele Vorschläge gebracht, aber du scheinst auf deiner Frickellösung zu beharren. Ich hab zum Beispiel in meinem letzten Post auch versucht, dir die Nachteile vom Rumgefrickel aufzuzeigen. Entweder du glaubst mir, oder ignorierst meinen Post weiterhin. Du musst ja schlussendlich wissen, wie du programmierst. Aber ich wünsche dir jetzt schon mal viel Spass beim Debuggen und Warten...
-
tenim schrieb:
und kritikfähig bin ich schon, das kannst du mir glauben. nur der ton macht die musik und es ist oft wichtiger, wie jemand etwas sangt, als was er sagt.
und der umgangston war einfach unhöflich. das erkennen viele leute nicht, weil sie einfach zu tief in ihrer materie drin sind und darauf keinen wert legen.Wo war jemand unhöflich? - Ist es wegen meinem WTF? - Ich habe wahrscheinlich als einziger gesagt, was er gedacht hat, als er das Konstrukt gesehen hat. Es bringt dir nichts, wenn wir hier sagen: "ja, mach mal.. das geht schon so..". Dann hast du irgendwann mal ein riesen Problem seie es, weil dein Programm aus "unerklärlichen" Gründen abstürtzt, oder weil dein Chef mal auf deinen Programmcode schaut. Und eines kann ich dir garantieren, wenn er so etwas sieht, dann wird er auch so etwas ähnliches, wie WTF sagen..
Vor allem als Anfänger sollte man sich mal auf die Standardbibliothek verlassen und sich nicht um Speicherverwaltun kümmern müssen. Das kannst du auch mal später noch machen, wenn du mehr Erfahrung hast..
-
@tenim,
Also zuerst einmal zumalloc. Ich würde in C++ keinmallocbenutzen, wenn du nicht ganz genau weisst, was du tust.mallocundnewsind intern etwas anders.Und zu deinem Problem:
Ich würde einen EnergieerzeugerManager machen, welcher die Energieerzeuger lädt und verwaltet. Von jedem Energieerzeuger brauchst du ja nur eine Instanz, mehr nicht.
In deinem Kraftwerk oder Schiff, machst du dann einfach einenstd::vector<Energieerzeuger*>. Und dazu eine Funktion, wo du die Dinger hinzufügen kannst. Also nicht per Konstruktor oder so, das hat meiner Meinung im Konstruktor nichts zu suchen.
Du holst dann beim Manager per ID oder Name den entsprechenden Energieerzeuger und übergibst diesen an das Kraftwerk oder Schiff.Im übrigen, würde ich nicht für jeden Energieerzeuger eine eigene Klasse erstellen. Es wäre sinnvoller, wenn du das in den Attributen vom Energieerzeuger speicherst. So kannst du am Ende sogar extern ein XML/Config File zur Verfügung stellen, wo du dann ganz einfach Energieerzeuger ergänzen oder verändern kannst.
... nur so Ideen

Grüssli
-
ok, danke für die mühe. ich schau mal, wie sich das macht mit std::vector.
bin halt eher ein pragmatischer programmierer und sehe bisher die vorteile des vectors noch nicht, weil ich ihn halt noch nicht kenne.
werd mich dann damit mal beschäftigen...p.s. ich hab schon ein c++ buch, das ich teilweise nebenbei lese. es ist "die c++ programmiersprache" von stosstrupp
oder wie der heisst.
-
tenim schrieb:
von stosstrupp

Ohman das ist Top
"stosstrupp" :D:D Nicht schlecht :p 
-
Firefighter, hast du jetzt einen Thread, wo du solche Dinge sammelst?

-
tenim schrieb:
von stosstrupp

- Echt Klasse.Wäre doch auch ein klasse Name für einen dieser speziellen Filme.. :p
-
Nexus schrieb:
Firefighter, hast du jetzt einen Thread, wo du solche Dinge sammelst?

Leider nein, ich hab ja kein Feedback von einem Moderator bekommen. Daher nochmal die Frage an die Mods, kann man eventuell so einen Sammelthread mit allen wunderbaren Sprachlichen Auswüchsen aufmachen und den festpinnen?
-
Ich finde immer noch den FAQ Eintrag auf Stroustrup's Seite so geil:
http://www.research.att.com/~bs/bs_faq.html#pronounceEr scheint noch oft Probleme mit seinem Namen zu haben

Grüssli
-
ok, nochmal zurück zum thema. ich hab meinen code jetzt auf vector-nutzung umgeschrieben. deshalb muss ich mir nicht mehr um die anzahl der elemente gedanken machen, die in die liste reinkommen weil dynamisch. aber auf die verwendung von "new" kann ich doch trotzdem nicht verzichten, weil ich ja die objektreferenzen irgentwie in den vector bekommen muss.
std::vector<A*> liste; liste.push_back(new A());und dann muss ich doch zum schluss wieder erst alle objekte über deren zeiger im vector mit delete freigeben, oder macht das der vector automatisch wenn er selbst zerstört wird?
meine das so:for(i=0;i<liste.size();i++) delete liste[i];ist das nötig?
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-231292-and-highlight-is-.html
schau mal hier.Da habe ich genau dieselbe Frage gestellt.
-
danke, was für ein zufall.

-
Diese Frage haben sich wohl schon einige gestellt. So viele, dass es eine Bibliothek in boost dafür gibt:
Pointer Container