Hallo zusammen,
ich habe beim Umziehen mein für meine Verhältnisse altes C++ Buch wiedergefunden. Hab überlegt mal reinzulesen, und fand es relativ interessant, vor allem weil ich inzwischen wirklich alles, was in C# nicht ist, vergessen habe. Zunächst fand ich die Erkenntnis sehr unterhaltsam, dass man mit dieser Sprache fast beliebig großen Mist in entsprechenden Mangen produzieren kann, und sogar das nur mit großem Aufwand. Bevor ein C++ Programierer sich jetzt beleidigt fühlt, ich meine Damit weniger den gelungenen(?) Übergang zur Objektorientierung(Sinn von Mehrfachvererbung etc.), sondern Sachen, mit denen man, wie in meinem Buch steht "im besten Fall einen Programmabsturz" erzeugt.(Verwendung gelöschter Zeiger, schreiben über Arrays hinaus, ähnliche Sachen mit referenzen, Speicherleaks etc.)
Allerdings kann ich es jedem reinen C# Programierer nur empfehlen etwas mehr über die Speicherverwaltung rauszufinden, was bei C++ notwendig ist, bei C# nützlich.(Meine Meinung)
ein Paar Dinge hab ich nicht kappiert.
Ich gedenke nicht mich jetzt viel damit zu beschäfftigen, also werde ich dafür nicht extra in ein C++ Forum gehen. Das werden mir sicher einige von euch genausogut erklären können.
Wenn man in der Klasse X die Klasse Y als Friend deklariert, erlaubt man Y auf die privaten Member von X zuzugreifen, oder?
Was soll aber die Sache mit den Friend methoden?
was mir weiterhin rätselhaft, bzw. nicht sinnvoll vorkommt, ist, dass C++ Polymorphie nur auf Zeigern (und Referenzen?) unterstützt, und dass ein Array und ein Zeiger relativ schwer auseinanderzuhalten sind- "ein Array ist ein konstanter Zeiger auf sein erstes Objekt" aber mir scheint, er merkt sich die Zahl seiner Objekte - er kann sie löschen
int main()
{
int* Werte=new int[3];
\*Werte=2; //erstes Objekt=2
\*(Werte+1)=3; //2. Objekt=3//geht das?
delete [] Werte; //er löscht alle, also muss er wissen, wie viele es sind.
//speichert er diese Anzahl irgendwo?
//und wenn ein Array ein Zeiger ist, ist ein Zeiger auch ein Array, oder?
int a=5;
int* pa=&a;
cout<<pa[0]; //geht das?
return 0;
}
Fehler sind nicht ausgeschlossen, da ich im neuen Visual C++ 2008 nicht mal "Hello World" hinkriege(er nimmt den cout<< Befehl nicht, obwohl iostream.h eingebunden ist). Das was IntelliSense anzeigt sieht mir sehr nach der .NET Bibliothek aus. (mit Event Handlern und so) Weiß jemand, wie man die Standart-C++ Bibliothek einstellt?
Hi
class A {
private:
int m_A;
friend inline std::ostream & operator <<
(std::ostream & stream, A const & a);
};
...
//.Cpp:
std::ostream & operator << (std::ostream & stream, A const & a){
stream << "A: " << a.m_A;
return stream;
//...
A a;
cout << a;
}
was mir weiterhin rätselhaft, bzw. nicht sinnvoll vorkommt, ist, dass C++ Polymorphie nur auf Zeigern (und Referenzen?) unterstützt
Das ist doch in C# auch nicht anders, nur dass hier bei Klassen immer gleich automatisch die Referenz gespeichert wird.
Die Anzahl der Elemente in Arrays weis ich auch nicht wo das beim allokieren im hintergrund gespeichert wird, man hat jedenfalls keine Möglichkeit darauf zuzugreifen.
int main()
{
int* Werte=new int[3];
\*Werte=2; //erstes Objekt=2
\*(Werte+1)=3; //2. Objekt=3//geht das? ... JA (stichwort Pointerarithmetik)
delete [] Werte; //er löscht alle, also muss er wissen, wie viele es sind.
//speichert er diese Anzahl irgendwo?
//und wenn ein Array ein Zeiger ist, ist ein Zeiger auch ein Array, oder?
int a=5;
int* pa=&a;
cout<<pa[0]; //geht das? JA
return 0;
}
cout nimmt er nicht, da du den wahrscheinlich den std nicht eingebunden hast
also:
#include <iostream> //hier ohne .h
using namespace std;
int main () {
greets
gut, dann ist ja das soweit klar. Jetzt habe ich entdeckt, das am Anfang bei Neues Projekt die Möglichkeit besteht, zwischen Win32 und CRL auszuwählen(das wäre dann Managed C++, oder- igitt(nicht eigene Erfahrung, steht in meinem C# Buch))
edit:einiges gelöscht
wozu ist eigentlich das std-namespace da? in meinem Buch steht natürlich wieder ncihts davon.
edit: wie funktioniert der code mit dem friend Teil? Ihr könnt mich ruhig blöd nennen, kappier ich nicht.
achso, gut. Aber warum macht man den operator nicht einfach öffentlich?
Hab noch nicht ernstzunehmend mit Managed C++ gearbeitet, was ich aber bisher gesehen habe ist es wirklich eine Perversion.
Wie gesagt musst du die meisten Systemincludes ohne .h angeben
(Unter VisualStudioInsterlationsverzeichniss\VC\include sieht man auch, dass iostream, string, ... kein .h als Endung haben)
Hurra! Der Mist funktioniert!!!
const int* pInt=0;
int a=5;
pInt=&a;
for(int i=0;i<10;i++)
{
cout<<pInt[i]<<"\n";
}
liefert
5
-858993460
-858993460
1245012
-858993460
1245112
4269240
1
3433112
3440168
hoffentlich habe ich jetzt nicht meine Passwörter verraten, oder sowas 👅
(Ja, ich weiß, dass man damit nichts anfangen kann)
Zurück zum Ernst und nochmal zum Operator:
Fragen:
Da der Operator hier in keiner Klasse ist wird ein Linkes und ein Rechtes Argument benötigt
2/3/4 Der Operator hier ist ausserhalb einer Klasse -> kein this, er ist nicht private, nur die Methode (bzw. der Operator) erhalten zugriff.
Man könnte ihn in-Place Implementieren oder einfach auch mit ins Cpp file und halt ohne Classname::
Man könnte es mit einer extention Method von C# vergleichen, wo der std::stream um eine Überladung des << Operaors erweitert wird und der Parameter stream quasi das this bei der extention Method wäre.
stdostream & operator << (stdostream & stream, A const & a)
A a1, a2;
cout << a1 << a2;
// | | |
//stream a |
//\___________/ |
// | |
// stream a
greets
PS:
const int* pInt=0; int a=5; pInt=&a; for(int i=0;i<10;i++) { cout<<pInt[i]<<"\n"; }
Ich hoffe dir ist klar das du damit schon zwangsläufig eine Zugriffsverletzung hast.
Ein Array muss nicht zwingend ein Pointer sein.
char blubb[100];
wäre zum Beispiel ein char Array der größe 100. Das mit den Pointern macht man nur, damit man die Größe variabel halten kann.
Drei Anmerkungen.
a) Die Frage Array / Pointer ist keine C++-Frage, sondern eine von ANSI-C.
b) C-Arrays sind keine Pointer, Punkt. (Allerdings erlaubt ANSI-C das behandeln von Array-Referenzen als Referenzen auf Pointer, und in gewissen Kontexten verhalten sie sich tatsächlich absolut gleich. Allerdings funktionieren die Lookups für die gehaltenen Werte unterschiedlich.
c)
Das mit den Pointern macht man nur, damit man die Größe variabel halten kann.
Unfug.
Peter van der Linden (hat, glaube ich, den C-Compiler bei Sun mit geschrieben) hat ein sehr unterhaltsames Buch zum Thema C geschrieben. http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298 kann ich nur wärmstens empfehlen. Erstens sehr interessant, zweitens das einzige Buch über C, bei dessen Lektüre ich im Zug laut losgelacht habe.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Hallo ANSI_code,
ich hatte überlegt, ob ich gleich was am Anfang zum Thema Sammelthreads was schreibe. Siehe [Hinweis] Wie poste ich richtig? Punkt 1.2. Ich dachte, ok, bei C++ drück ich mal ein Auge zu und hab dann den Titel so geändert, damit klar ist, dass es um drei Fragen geht. Nun ist aber die Grenze mehr als überschritten. Du kannst hier bitte nicht alles in einem Thread fragen, was du schon immer über C++ wissen wolltest.
Du bist doch schon Lage dabei und solltest es besser wissen. Ich bin ehrlich etwas entsetzt.
herbivore
tut mir leid. Das war auch nicht meine Absicht - ich habe den Thread im Smalltalkforum erstellt, mit dem Titel "Hilfe, C++".
Dabei wollte damit weniger Fragen zu diesen Themen stellen, und mich dann ernsthaft damit beschäfftigen(dann wäre ich wirklich in ein C++ Forum), sondern nur, sagen wir, C++ in Punkto "Sinnloser Missbrauch von Möglichkeiten" mit C# vergleichen. Dazu auch meine Zugrifftverletzung: ich weiß, es ist nutzlos, verrückt, und für mich gleichzeitig ein Hinweis auf Compiler, die einem alles erlauben.
War wirklich nicht so beabsichtigt. Das Thema ist jetzt sowieso erledigt, denke ich.
Hallo ANSI_code,
ich habe den Thread im Smalltalkforum erstellt, mit dem Titel "Hilfe, C++".
und damit eben leider im falschen Forum und mit einem leider nichtssagend den Titel, weshalb ich ja auch verschoben und umbenannt habe.
herbivore