PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Fragen]C++ und die Doppelpunkte


Käsetoast
2013-04-16, 11:12:44
Hallo!

Ich bräuchte mal eure Hilfe bei ein paar Verständnisfragen. Es geht um C++ und die doppelten wie auch einfachen Doppelpunkte. Ich versuche da gerade durchzublicken, fische aber noch ein wenig im Trüben. Derzeit habe ich da folgenden Eindruck:

A) Einfacher Doppelpunkt ":"
Wird zur Vererbung benutzt. Ich kann also eine Klasse erzeugen und wenn ich dann eine "Unterklasse" will kann ich die via "Alte Klasse : Neue Unterklasse" erzeugen.

B) Doppelter Doppelpunkt "::"
Hier bin ich mir total unsicher. Einerseits kann ich zum Beispiel innerhalb einer Funktion über ein ::k auf die globale Variable k zurückgreifen wenn diese durch eine lokale Variable k verdeckt ist. Dann wäre da die Namespace Geschichte wo wenn ich das hier habe...
namespace block1
{
int x = 5
}
... ich extern dann in diesen Speicherbereich springen kann und mir mit block1::x den Wert von x holen kann.
Außerdem wird "::" dann noch im Zusammenhang mit Klassen genutzt wo sich das dann Konstruktor schimpft. Da merke ich gerade, dass ich schon wieder die Hälfte von vergessen habe. Das war glaube ich gut um z.B. die in einer Klasse deklarierte Funktion extern zu definieren. Also wenn ich in meiner Klasse "Datum" zum Beispiel die Funktion Datum(); stehen habe, kann ich diese Funktion an anderer Stelle über Datum:: Datum() {blabla} definieren. Je nachdem ob ich da dann noch Argumente mitliefere oder nicht ist das dann ein allgemeiner Konstruktur, ein Standardkonstruktor und ich glaube es gab noch zwei weitere Arten...

Sehe ich das soweit richtig? Gibt's für den einfachen Doppelpunkt noch andere Anwendungen außer dem Vererben?

Gast
2013-04-16, 11:39:44
Einen einfachen Doppelpunkt gibt's auch bei switch() Anweisungen:


switch(foo){
case BAR: break;
}


Oder bei Sprungmarken:



int foo() {

if (value == 0) { goto label; }
else { return bar(); }

label:
return -1;
}


Oder bei inline Konditionen:



(value == 0) ? foo() : bar();

Marscel
2013-04-16, 15:00:32
Es gibt noch Intialisierungslisten (http://de.wikipedia.org/wiki/Initialisierungsliste).

Gast
2013-04-16, 15:09:22
Hallo!

Ich bräuchte mal eure Hilfe bei ein paar Verständnisfragen. Es geht um C++ und die doppelten wie auch einfachen Doppelpunkte. Ich versuche da gerade durchzublicken, fische aber noch ein wenig im Trüben. Derzeit habe ich da folgenden Eindruck:

A) Einfacher Doppelpunkt ":"
Wird zur Vererbung benutzt. Ich kann also eine Klasse erzeugen und wenn ich dann eine "Unterklasse" will kann ich die via "Alte Klasse : Neue Unterklasse" erzeugen.

B) Doppelter Doppelpunkt "::"
Hier bin ich mir total unsicher. Einerseits kann ich zum Beispiel innerhalb einer Funktion über ein ::k auf die globale Variable k zurückgreifen wenn diese durch eine lokale Variable k verdeckt ist. Dann wäre da die Namespace Geschichte wo wenn ich das hier habe...
namespace block1
{
int x = 5
}
... ich extern dann in diesen Speicherbereich springen kann und mir mit block1::x den Wert von x holen kann.
Außerdem wird "::" dann noch im Zusammenhang mit Klassen genutzt wo sich das dann Konstruktor schimpft. Da merke ich gerade, dass ich schon wieder die Hälfte von vergessen habe. Das war glaube ich gut um z.B. die in einer Klasse deklarierte Funktion extern zu definieren. Also wenn ich in meiner Klasse "Datum" zum Beispiel die Funktion Datum(); stehen habe, kann ich diese Funktion an anderer Stelle über Datum:: Datum() {blabla} definieren. Je nachdem ob ich da dann noch Argumente mitliefere oder nicht ist das dann ein allgemeiner Konstruktur, ein Standardkonstruktor und ich glaube es gab noch zwei weitere Arten...

Sehe ich das soweit richtig? Gibt's für den einfachen Doppelpunkt noch andere Anwendungen außer dem Vererben?
Bitte besorg dir ein ordentliches Lehrbuch über C++ oder such dir ein ordentliches Web-Tutorial.

Da ist so viel falsch und schwammig.....du solltest wirklich mit einem ordentlichen Buch mal ganz von vorne anfangen.

Käsetoast
2013-04-17, 08:46:03
Schonmal danke für die Antworten...

Bitte besorg dir ein ordentliches Lehrbuch über C++ oder such dir ein ordentliches Web-Tutorial.
Ein Buch habe ich. Das Problem ist, dass ich meine Kenntnisse größtenteils nur wieder auffrischen muss (liegt schon etliche Jahre zurück seit ich mit damit näher beschäftigt habe) und da stößt halt auch ein Lehrbuch an seine Grenzen, da dort ja stets nach Thema und nicht z.B. Operator gelehrt wird. Inzwischen habe ich aber rausbekommen, dass das "::" im Englischen scope heißt bzw. besser gesagt es darum geht und man so im Internet ein wenig gezielter suchen kann (zumindest finde ich die englischen Quellen die man so findet tendentiell ergiebiger als die deutschen)... :smile:

Gast
2013-04-17, 10:02:01
Schonmal danke für die Antworten...


Ein Buch habe ich. Das Problem ist, dass ich meine Kenntnisse größtenteils nur wieder auffrischen muss (liegt schon etliche Jahre zurück seit ich mit damit näher beschäftigt habe) und da stößt halt auch ein Lehrbuch an seine Grenzen, da dort ja stets nach Thema und nicht z.B. Operator gelehrt wird. Inzwischen habe ich aber rausbekommen, dass das "::" im Englischen scope heißt bzw. besser gesagt es darum geht und man so im Internet ein wenig gezielter suchen kann (zumindest finde ich die englischen Quellen die man so findet tendentiell ergiebiger als die deutschen)... :smile:
Das ist nicht böse gemeint, aber wenn du nicht mal mehr wusstest was die :: bei c++ sind (bzw. wie die hiessen) dann reicht ein "auffrischen" IMHO nicht mehr aus.

Allein bei jeder Klasse die du schreibst stolperst du in den .cpp Dateien über massen von "::".

Wenn du also ein Buch hast, fang einfach nochmal von vorne an es zu lesen.

Ectoplasma
2013-04-17, 14:38:58
Das ist nicht böse gemeint, aber wenn du nicht mal mehr wusstest was die :: bei c++ sind (bzw. wie die hiessen) dann reicht ein "auffrischen" IMHO nicht mehr aus.

Allein bei jeder Klasse die du schreibst stolperst du in den .cpp Dateien über massen von "::".

Wenn du also ein Buch hast, fang einfach nochmal von vorne an es zu lesen.

Naja, das würde ich jetzt nicht so unterschreiben. Das kann im Falle des Gastes vielleicht stimmen, aber manchmal macht dich jahrelanges arbeiten mit einer Sprache so betriebsblind, dass man das tatsächlich nicht hundertprozentig weiss, obwohl man es täglich benutzt.

Nagelbrett
2013-04-17, 17:02:14
Gibt's für den einfachen Doppelpunkt noch andere Anwendungen außer dem Vererben?

bei bit fields in structs:
struct blah {
unsigned first_bit : 1;
unsigned rest : 7;
};

Käsetoast
2013-05-03, 15:59:04
Wo ich nun schon ein Thema für "dumme" Fragen habe:

Der folgende Code soll eine Zeile in einem tabellenartigen Modell einfügen (Qt) und ist Teil einer Funktion bzw. Methode dafür:
if (!model->insertRow(index.row()+1, index.parent()))
return;


Darf man das so schreiben wenn man meint, dass falls das Ausführen des Kommandos fehlschlägt er die Funktion abbrechen soll (danach kommt nämlich noch ein wenig Kram was als Daten in die Zeile geschrieben werden soll)?

Ich kannte das so bisher nur als generellen "early return" um eine Funktion abzubrechen wenn die Bedingung in der Klammer wahr ist - das man so aber auch den Kram in der if-Klammer selber ausführen kann war mir neu...

Gast_samm
2013-05-03, 16:32:21
Das, was in der Klammer nach dem if steht, muss in einem bool resultieren. Ob es eine Methode/Funktion oder sonst etwas ist, spielt keine Rolle. In diesem konkreten Fall müsste also die Methode insertRow() einen return-Wert vom Typ bool haben.

Käsetoast
2013-05-04, 14:08:12
In der Tat - die Funktion für's Einfügen einer Zeile ist als bool ausgelegt. Hab' ich wieder mal was gelernt, das so auch in meinen schlauen Büchern nicht drin stand... :smile:

Käsetoast
2013-05-08, 12:58:55
So - ich hätte dann mal wieder eine neue Frage, wobei's diesmal eher um einen Ansatz geht denn um konkreten Code...

Wie hier bereits angedeutet arbeite ich an einem Baummodell. Das kann man dann beliebig auslegen. Nun stehe ich vor folgendem Hindernis: Es ist möglich eine zusätzliche Spalte einfügen zu lassen. In dieser Spalte steht dann immer ein gewisser Datentyp. Um auszuwählen was für eine Spalte man haben will gibt's einen Dialog, in dem man "vorgefertigte" Typen von Spalten auswählen kann. An der Stelle kommt dann mein Problem ins Spiel...

Es soll halt möglich sein nachträglich neue Spaltentypen anzulegen und damit das dann möglich einfach geht soll das Ganze dann modular ausfallen. Das heißt es wird irgendwo angegeben, dass Spaltentyp XYZ den Namen "ABC" hat und Datentyp "DEF" zum Einsatz kommen soll und der Rest wird von einem "Manager" übernommen (also das Aufführen des neuen Spaltentyps in der Auswahlliste und so weiter und so fort). Der Haken besteht nun beim Datentyp bzw. sagen wir vielleicht eher beim "Editor für den Datentyp", da die einzelnen Zellen des Modells alles schlucken was ich reinschreibe. Nachdem der jeweilige Spaltentyp gewählt worden ist, soll dann eben eine neue Spalte eingefügt werden. Hierbei wird dann der Datentyp-Editor mit einem "new" der Editor-Klasse ins Leben gerufen und dann entsprechend den Zellen der Spalte zugewiesen. An dieser Stelle hänge ich nun...

Mein Problem: Da C++ nicht interpretiert ist kann ich keine Funktion schreiben von wegen:
KLASSENPLATZHALTER editor = new KLASSENPLATZHALTER;

Geht ja nicht, weil sich das ja erst zur Runtime entscheiden würde was in dem Platzhalter nun genau stehen soll. Kann mir hier jemand unter die Arme greifen mit Tipps wie man das am Besten handhabt?

Was ich halt irgendwie bräuchte wäre eine Funktion die quasi das macht was ich oben im Code-Fenster geschrieben habe. Ich weiß jetzt halt nicht wie ich es anstellen soll, dass eine Klassenbezeichnung halt wie eine Variable zu verwenden ist. Aber vielleicht geht's natürlich auch einfacher... :wink:

EDIT:
Wobei wenn ich das was ich da geschrieben habe nochmal lese: Das müsste sich mit simplen If-Statements doch lösen lassen. Problem wäre dann nur noch wie ich doppelte Objektnamen vermeide bei der "new" Geschichte...

Thunderhit
2013-05-08, 13:13:53
C++ interpretiert? Oh Gott...
Wie wärs, wenn du einfach eine Klasse/Struct erstellst, die als eine solche Spalte dient und entsprechende Informationen (Name, Datentyp etc.) bereithält. Die Datentypen machst du als enum, da du feste Datentypen hast.
Wenn dann eine neue Spalte eingefügt werden soll, machst du einfach ein switch case und gehst da alle Typen durch, die in deinem enum stehen und die der User daher auswählen kann.

Käsetoast
2013-05-08, 13:29:56
C++ interpretiert? Oh Gott...
Ach, da hat sich ein "nicht" verdrückt... :wink:
Ist aber denke ich aus dem Kontext klar geworden, dass ich das richtige meinte...

Wie wärs, wenn du einfach eine Klasse/Struct erstellst, die als eine solche Spalte dient und entsprechende Informationen (Name, Datentyp etc.) bereithält. Die Datentypen machst du als enum, da du feste Datentypen hast.
Wenn dann eine neue Spalte eingefügt werden soll, machst du einfach ein switch case und gehst da alle Typen durch, die in deinem enum stehen und die der User daher auswählen kann.
Glaube nicht, dass das ginge, wobei ich nochmal drüber nachdenken müsste. Ich schreibe das Programm halt mit Hilfe von Qt und benutze dessen itemview model das alles mögliche regelt - da kann ich die Spalte also nicht komplett nach eigenem Code behandeln (sonst hätte ich mir Qt ja direkt sparen können wenn ich dann sowieso alles selber schreibe)...

Ich brauche halt eine Funktion die für das Einfügen einer neuen Spalte sorgt. Das sieht im Wesentlichen so aus:
pModel->insertColumns(index.column()+1, 1, index.parent());

SpinBoxDelegate_positive *pSpinBox = new SpinBoxDelegate_positive;
tree_view->setItemDelegateForColumn(index.column()+1, pSpinBox);


Ich bräuchte halt eine Möglichkeit den obigen Code automatisch erstellen zu lassen. Die Alternative besteht natürlich darin, dass man halt eine Reihe if-statements hat für jeden vordefinierten Fall und man dann eine neue Variante per Hand dazuschreibt. Ist durchaus gut machbar, auch wenn's etwas mehr Code ist als ich hier reingeschrieben habe. Nach Möglichkeit soll man aber halt nur den Logik für den neuen Editor schreiben müssen, gibt dann noch einen Namen für die neue Spalte mit und der Rest läuft vollautomatisch...

Ectoplasma
2013-05-08, 15:04:20
In diesem konkreten Fall müsste also die Methode insertRow() einen return-Wert vom Typ bool haben.

Nein, ist nicht ganz richtig. Es kann jeder beliebige integrale Datentyp sein. Alles ungleich von 0, egal ob int, long, ja sogar der Wert eines Pointers, resultiert zu "true". Bei 0 zu "false".

Käsetoast
2013-05-10, 09:54:09
Nein, ist nicht ganz richtig. Es kann jeder beliebige integrale Datentyp sein. Alles ungleich von 0, egal ob int, long, ja sogar der Wert eines Pointers, resultiert zu "true". Bei 0 zu "false".
Ok, danke für die Aufklärung. Klingt irgendwo auch sinnvoll das generell so zu handhaben und nicht nur auf bools zu beschränken, weil's dann ja doch ein wenig Tipperei spart...

Gast_samm
2013-05-10, 13:24:19
Nein, ist nicht ganz richtig. Es kann jeder beliebige integrale Datentyp sein. Alles ungleich von 0, egal ob int, long, ja sogar der Wert eines Pointers, resultiert zu "true". Bei 0 zu "false".Ja gut, und auch bool selbst ist ja implementationsabhängig, was da wirklich für Werte dahinter stehen. Ich fand einfach in dem Zusammenhang, wo eine "insertRow"-Methode als quasi Nebeneffekt noch den Erfolg der Operation zurückmeldet, und davon Ausgegangen wird, dass "true" Erfolg bedeutet, den Hinweis auf andere Datentypen unangebracht. Grund: bei int-Rückgabewerten ist es oft so, dass 0 Erfolg bedeutet und andere Werte sind Fehlercodes. Zugegebenermasen hätte ich vielleicht einfach diesen Satz etwas umformulieren sollen:Das, was in der Klammer nach dem if steht, muss in einem bool resultieren"..., muss als Wahrheitswert verarbeitet werden können". Dass das dann auf praktisch alles zutrifft, ist letztlich eher kontraproduktiv für den Programmierstil, imho, gerade wenn der Fragesteller erst gerade mit C++ beginnt.

Gast
2013-05-11, 21:31:39
Ein Buch habe ich.

DU brauchst ein aktuelles und vor allem gutes C++ Buch, dass dir modernen sauberen C++ Stil beibringt.


Die C++ Bücher von vor 10 Jahren sind meist von "von C nach C++" alte Hasenumsteigern geschrieben worden, durch deren Bücher lernst du keinen guten C++ Stil.

Und bei den modernen Büchern gibt's noch lange keine Garantie, dass das guter C++ Stil ist.


Kauf dir das Buch "Der C++ Programmierer", dann hast du was ordentliches in der Hand. Oder eben den Stroustrupp, davon eine moderne Auflage.

Käsetoast
2013-05-13, 10:02:09
Ja, an der C->C++ Geschichte ist was dran - gerade bei Internet Tutorials ist mir das aufgefallen... :wink:
Ich habe das Buch von Dietrich May, das dahingehend ganz okay ist, wobei ich finde das einige Dinge zu umständlich oder kryptisch beschrieben sind. Die scope Geschichte wird halt verstreut über mehrere Kapitel erklärt (kommt mal bei den namespaces vor und dann 100 Seiten später bei den Klassen erneut). Deswegen hatte ich zunächst gedacht, dass das irgendein abgefahrener Operator ist, wo man Speicherbereiche und was weiß ich nicht alles im Hinterkopf haben muss, wenn man den anwenden will. Im Endeffekt war das dann aber doch deutlich simpler als gedacht...

Aber danke für den Buchtipp - das werde ich mir mal ansehen. Was Aktuelleres anzuschaffen ist vielleicht auch wegen dem neuen Standard eine gute Idee, wobei man mir gesagt hat, dass der Unterschied bzw. die Neuerungen eher marginal sind. Auf der anderen Seite: Die Complier hier in der Firma sind da noch nicht auf dem neuesten Stand und werden demnächst wohl auch nicht aktualisiert werden...