[Frage] C++

08/24/2010 18:51 ©rossi™#1
Hi :D;

ich weiß die Frage ist ziemlich dumm (bin aber noob hab gerade erst angefangen).
Also ich wollte ne Konsolenanwendung machen , die die Hauptstädte einiger Länder ausgibt nur ich komme mit den if befehlen nicht klar xD also mein code sieht so aus :

Code:
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string land;
    cout << "Geben sie ein europäisches land ein: ";
    cin >> land;

if (land == Italien)// mein problem !!!!! Da ich nicht weiß wies richtig geht
{
    cout << "Italiens Hauptstadt ist : Rom\n";
}
}
08/24/2010 19:32 Noisuf-X#2
du musst auch land mit einem string vergleichen
oder du deklarierst irgentwo eine Variable Italien als string

Quote:
land == "Italien"
08/24/2010 19:50 ©rossi™#3
thx das wars hab ich garnicht dran gedacht
08/24/2010 20:12 Bl@ze!#4
"==" ist ein (Vergleichs-)Operator.
Du solltest dir "Operatoren" anschauen und auch "Datentypen", dass wird dir bestimmt weiterhelfen ;)
08/25/2010 19:35 IceTray#5
Kannst auch einen switch benutzen.

Code:
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string land;
    cout << "Geben sie ein europäisches land ein: ";
    cin >> land;

switch(land)
{
   case Italien:
      cout << "Italiens Hauptstadt ist : Rom\n";
   default:
      cout << "blub"; // wenn gar nichts zutrifft
}
}
Ansonsten solltest du für das näcgste if "else if" verwenden.
08/25/2010 21:32 MrSm!th#6
Quote:
Originally Posted by IceTray View Post
Kannst auch einen switch benutzen.

Code:
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string land;
    cout << "Geben sie ein europäisches land ein: ";
    cin >> land;

switch(land)
{
   case Italien:
      cout << "Italiens Hauptstadt ist : Rom\n";
   default:
      cout << "blub"; // wenn gar nichts zutrifft
}
}
Ansonsten solltest du für das näcgste if "else if" verwenden.
Nein, kann er nicht.
1. bei dir ist der gleiche Fehler, Italien ist ohne "", also wird es als nicht deklarierter Variablenname angesehen
2. die case's bei einem switch Statement müssen einen int Wert haben, also kann man nur Zahlen oder Buchstaben behandeln

Code:
case 1:  //ok
case "1": //fehler
case '1': //ok
08/25/2010 21:49 Noisuf-X#7
Quote:
Originally Posted by MrSm!th View Post
Nein, kann er nicht.
1. bei dir ist der gleiche Fehler, Italien ist ohne "", also wird es als nicht deklarierter Variablenname angesehen
2. die case's bei einem switch Statement müssen einen int Wert haben, also kann man nur Zahlen oder Buchstaben behandeln

Code:
case 1:  //ok
case "1": //fehler
case '1': //ok
zur genaueren Erklärung:
Bei switch ist in C/C++ und C++/CLI ist es nur möglich als int darstellbare Werttypen verwendet werden (char, short, int, long, Enurmerationen und bool). Bei .NET Sprachen kann man aber bei switch auch strings verwenden. Deswegen ist die Antwort nicht Kilometer weit her geholt aber trotzdem falsch.

Was ich bloß nicht verstehe ist warum es bei C# und VB.Net geht aber bei C++/CLI nicht. :confused:
Naja wer weiss schon was sich M$ dabei denkt.
08/25/2010 22:07 MrSm!th#8
Weil .NET komplett objekt-orientiert ist.
Bei C++ müsste der Compiler ja bei jedem case mit nem String einen Call zu strcmp,_tcscmp oder _wcscmp einsetzen, was nicht mehr der Definition von switch/case entspricht.
Bei einer komplett objekt-orientierten Sprache sind auch Int usw. Klasse, es macht also keinen Unterschied, ob der Operator == für einen Int oder für einen String aufgerufen wird, während wie gesagt bei C(++) nur bei Strings der Operator == bei strings oder eben die oben genannten Funktionen für Strings in Form eines Char Arrays eingesetzt werden müsste und bei int ein ganz normales cmp (asm befehl zum vergleichen von Ganzzahlen).

Ich denke mal, .NET unterstützt in seinem Bytecode auch Befehle zum Stringvergleichen...
08/25/2010 22:43 Noisuf-X#9
Quote:
Originally Posted by MrSm!th View Post
Weil .NET komplett objekt-orientiert ist.
Bei C++ müsste der Compiler ja bei jedem case mit nem String einen Call zu strcmp,_tcscmp oder _wcscmp einsetzen, was nicht mehr der Definition von switch/case entspricht.
Bei einer komplett objekt-orientierten Sprache sind auch Int usw. Klasse, es macht also keinen Unterschied, ob der Operator == für einen Int oder für einen String aufgerufen wird, während wie gesagt bei C(++) nur bei Strings der Operator == bei strings oder eben die oben genannten Funktionen für Strings in Form eines Char Arrays eingesetzt werden müsste und bei int ein ganz normales cmp (asm befehl zum vergleichen von Ganzzahlen).

Ich denke mal, .NET unterstützt in seinem Bytecode auch Befehle zum Stringvergleichen...
Tut mir leid aber die Antwort ist vollkommen falsch.
Es ist nicht ganz so einfach wie du dir das vorstellst

Außerdem gibt es einen riesigen Unterschied zwischen C/C++ und C++/CLI wenn du den nicht kennst würde ich mal schleunigst nachlesen, C++/CLI kommt von M$ und ist Managed (also es hat die CLI als Runtime drunter genau wie die anderen .NET Sprachen) und ist nicht gleich C/C++.
Deswegen wunder ich mich auch warum das switch Statment nicht so wie in C# reagiert.

Und zu deinen komischen Aufstellungen:
1. .NET nicht komplett Objekt-orientiert es gibt da 3 Unterscheidungen Werttypen, Verweistypen und Zeigertypen. zb arbeitest du wenn du Objekte als Funktionsparameter übergibst immer mit der Referenz, Structs oder andere Werttypen werden immer kopiert.
2. int, char etc... sind in .NET Werttypen keine Klassen, bloß string ist ein Verweistyp.
3. du kannst im Switch Statment von zB C# nur string und (char, short, int, long, Enurmerationen und bool) vergleich, keine Objekte, kein float und keine Structs vergleichen.

Achso fast vergessen C++/CLI wird auch in die IL übersetzt genau wie C# oder VB.Netm deshalb nur mein Kommentar unter meinem letzten Post nicht weil ich zu blöd bin den Wald vor lauter Bäumen nicht zusehen.
08/25/2010 23:20 MrSm!th#10
Quote:
Originally Posted by Noisuf-X View Post
Tut mir leid aber die Antwort ist vollkommen falsch.
Es ist nicht ganz so einfach wie du dir das vorstellst
Entschuldige, wie du schon sagst, vorstellte.
Das war eine Vermutung ;< Hab ich vielleicht nicht deutlich genug geschrieben.
Quote:
Außerdem gibt es einen riesigen Unterschied zwischen C/C++ und C++/CLI wenn du den nicht kennst würde ich mal schleunigst nachlesen, C++/CLI kommt von M$ und ist Managed (also es hat die CLI als Runtime drunter genau wie die anderen .NET Sprachen) und ist nicht gleich C/C++.
Deswegen wunder ich mich auch warum das switch Statment nicht so wie in C# reagiert.
Den Kenne ich, ich hab das C++/CLI so verstanden, dass C++ eine Sprache ist und CLI die .NET Erweiterung Q_Q
Da lag ich wohl völlig falsch, habe gerade nachgelesen, dass C++/CLI so zusammengehört (dachte du meinst einmal C++ und einmal C++ mit CLI)
Quote:
Und zu deinen komischen Aufstellungen:
1. .NET nicht komplett Objekt-orientiert es gibt da 3 Unterscheidungen Werttypen, Verweistypen und Zeigertypen. zb arbeitest du wenn du Objekte als Funktionsparameter übergibst immer mit der Referenz, Structs oder andere Werttypen werden immer kopiert.
2. int, char etc... sind in .NET Werttypen keine Klassen, bloß string ist ein Verweistyp.
Joa, ein bisschen habe ich schonmal gelesen über die Implementierung von .NET, das hatte ich jetzt mit Java verwechselt (das ist doch aber komplett oo, oder bin ich da nun auch falsch? Q_Q)
Quote:
3. du kannst im Switch Statment von zB C# nur string und (char, short, int, long, Enurmerationen und bool) vergleich, keine Objekte, kein float und keine Structs vergleichen.
Dann ist es evtl. einfach eine Designentscheidung, die von MS so getroffen wurde?
Warum muss man bei 2 Explorer Fenstern in das jeweilige klicken, damit man darin scrollen kann, warum wird der Fokus nicht automatisch vergeben? :p