Fehler bei String
-
Xenomorphobia schrieb:
Ich habe die Suchfunktion dieses Forums genutzt. Als Suchbegriff habe ich error C2679 angegeben. Gerade weil ich eigentlich kein Problem mit der Nutzung eines Forums habe, habe ich nach einem Thread gesucht, der diesen Fehler bahndelt.
Normalerweise erstellt man allerdings einen neuen Thread, unter Umständen kann man den anderen verlinken. Aber sehr gut, dass du die Suchfunktion benutzt hast, das machen nämlich nicht gerade viele.

Xenomorphobia schrieb:
Ich ging bisher immer davon aus, dass für Zeiger manuell Speicher adressiert/freigegeben werden sollte - der Übertragbarkeit der Programme wegen.
Nein, Abstraktion schränkt die Portabilität normalerweise nicht ein - sofern du dabei standardkonform bleibst.
In C++ hantiert man im Anwendungscode eigentlich eher selten mit rohen Zeigern - zumindest viel seltener als in C. Containerklassen nehmen einem die Speicherverwaltung mehrerer dynamischer Objekte ab. Zudem kann man die meisten Variablen, gerade von Typen wie
intoderchar, auf dem Stack anlegen - wie schon in C. Das ist nicht nur schneller, sondern auch sicherer. Und für einenintlohnt sich der Overhead eines Zeigers bestimmt nicht - man verschwendet nur Speicher, Rechenzeit und verliert Sicherheit. Es sei denn, man braucht tatsächlich einen Zeiger aufgrund einer gewünschten Funktionalität.
-
Xenomorphobia schrieb:
asc schrieb:
b) malloc/free sollte man in C++ mit Vorsicht verwenden (Kein Konstruktor-/Destruktoraufruf...), besser new/delete
Das habe ich, weil gelesen, erfolglos versucht.
Würdest du auch sagen, was der Misserfolg war?
// Auch wenn die dynamische Reservierung in deinen Fall für überflüssig halte char * pc = new char[20]; // Verwendung von new[] bei Arrays delete pc[]; // Freigabe mittels delete[] int * pi = new int(0); // Verwendung von new für Einzelwerte delete pi; // Freigabe mittels deleteXenomorphobia schrieb:
Das ich so intensiv dynamisch Speicher alloziiere kommt daher, dass ich auch schon in C lieber mit Zeigern programmierte als "call by value" zu nutzen - uns wurden ja auch die Vorteile der Zeiger nicht vorenthalten.
In C++ kann man Referenzen verwenden:
#include <iostream> #include <string> void foo( int & v1, // Referenzen sind nur Aliasnamen für die Urprungsvariable std::string & v2) // Konkret: { // a) Im Gegensatz zu Zeigern MUSS ein gültiger Wert v1 = 10; // existieren (NULL ist unzulässig) v2 = "abcde"; // b) Eine Werteänderung über die Referenz ändert die } // Ursprungsvariable // c) Referenzen lassen sich nicht "umbiegen" void foo2( int const & v1, // Referenzen auf konstanten Wert, keine Kopie aber std::string const & v2) // auch keine Änderung möglich { std::cout << i << " " << a; // Ausgabe von "10 abcde" } int main() { int i; std::string a; foo(i, a); foo2(i, a); }Sofern man also keine NULL-Werte zulassen will, und auch kein "umbiegen" (Wie eine Zeigeränderung ja im Gegenzu ermöglicht) sind Referenzen ebenso geeignet. Man sollte tatsächlich Call-By-Value bei nicht Integralen Datentypen verwenden aber Referenzen ermöglichen dies ohne über Zeigerbehandlung nachdenken zu müssen (const & sollte man Verwenden wenn man keine Änderung zulassen will).
cu André