|
|
|
|
C++-Frage:
ich möchte im grunde das tun:
|
Code: |
QTextStream out =
if (args.length() < 2 || args.at(1) == "-") {
QTextStream(stdout)
} else {
QFile file(args.at(1));
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream(&file)
}; |
|
bloß sind conditionals C++ keine expressions.
ich könnte über eine funktion gehen, aber das is auch hässlich…
anderesseits muss ich die datei auch schließen…
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von flying sheep am 11.07.2014 17:09]
|
|
|
|
|
|
|
Code: |
QTextStream out;
QFile * f = NULL;
if (args.length() < 2 || args.at(1) == "-") {
out = QTextStream(stdout)
} else {
f = new QFile(args.at(1));
f->open(QIODevice::WriteOnly | QIODevice::Text);
out = QTextStream(f);
};
//...
if(f != NULL)
f->close(); |
|
Bestimmt werde ich gleich ausgelacht.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Oli am 11.07.2014 18:00]
|
|
|
|
|
|
Man handelt als Privatperson fahrlässig, wenn man keinen AV installiert hat und der eigene Rechner Schaden anrichtet. Übrigens.
|
|
|
|
|
|
|
Nö, Standardweg. Wenn QFile copy-assignable oder movable ist, wäre pointerlos natürlich schöner. Ich tippe mal auf QFile ist movable, aber nicht kopierbar.
|
|
|
|
|
|
|
| Zitat von teK
Man handelt als Privatperson fahrlässig, wenn man keinen AV installiert hat und der eigene Rechner Schaden anrichtet. Übrigens.
| |
Auch als Linuxer?
|
|
|
|
|
|
|
Vor dem Gesetz sind alle Betriebssystem gleich. Letztlich denke ich, dass man sowohl dafür als auch dagegen argumentieren kann. Es gibt da mehrere Kriterien: ob es dem Nutzer von der technischen, finanziellen und Verfügbarkeitshaberischen (das ist kein juristischer Ausdruck) Komplexität her zugemutet werden kann.
|
|
|
|
|
|
|
| Zitat von csde_rats
| Zitat von teK
Man handelt als Privatperson fahrlässig, wenn man keinen AV installiert hat und der eigene Rechner Schaden anrichtet. Übrigens.
| |
Auch als Linuxer?
| |
Das wird bestimmt direkt als Vorsatz gewertet und du kommst in den Hackertool-Todesknast.
Notfalls argumentiert man einfach, der Virus hätte das Anti-Virus entfernt.
|
|
|
|
|
|
|
| Zitat von Oli
|
Code: |
QTextStream out;
out = … |
|
| | das geht nicht: | /usr/include/qt/QtCore/qtextstream.h:194:5: error: ‘QTextStream& QTextStream::operator=(const QTextStream&)’ is private | |
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von flying sheep am 11.07.2014 18:48]
|
|
|
|
|
|
|
|
|
|
Damit man's nicht kopieren kann. (RAII -> würde das Objekt kopiert, müsste man entweder den Handle duplizieren -> teuer/geht manchmal gar nicht od. riskiert ein double-free oder muss intern doch refcounting machen. In C++11 kann man nicht-kopierbare ABER movable Objekte machen, was genau für sowas gedacht ist)
Ergo brauchst du pointer, aber dann nimm bitte unique_ptr.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 11.07.2014 18:57]
|
|
|
|
|
|
| Zitat von csde_rats
Damit man's nicht kopieren kann. (RAII -> würde das Objekt kopiert, müsste man entweder den Handle duplizieren -> teuer/geht manchmal gar nicht od. riskiert ein double-free oder muss intern doch refcounting machen. In C++11 kann man nicht-kopierbare ABER movable Objekte machen, was genau für sowas gedacht ist)
Ergo brauchst du pointer, aber dann nimm bitte unique_ptr.
| | ja lol, das ist ein viel zu großer hack und viel zu wenig wissen, um über best practices nachzudenken.
hier ist sein sourcecode, auf sich selbst ausgeführt
khighlighter
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von flying sheep am 11.07.2014 19:20]
|
|
|
|
|
|
das ist mein 2. C++-programm. (sonst noch ein C-programm und das war’s mit erfahrung in der sprachfamilie)
immerhin habe ich inzwischen verstanden, was „&“ bedeutet:- in funktionssignaturen bedeutet es: „wenn du mir ein objekt gibst, kannst du es in mir wie außerhalb verwenden, aber ich kopiere es dafür nicht“
- sonst erstellt es einen pointer zu diesem objekt, also kann eine funktion
void foo(string* bar) {...} mit string baz = "baz"; foo(&baz) aufgerufen werden
|
|
|
|
|
|
|
Praktisch richtig, aber zu 2.) erstellt & keinen Pointer sondern & ist generell der Operator um die Adresse eines Objektes zu bekommen, was einen Pointer dann zugewiesen werden kann. Das braucht man auch außerhalb von Parametern für Funktionen.
|
|
|
|
|
|
|
jo, das hab ich missverständlich ausgedrückt. &baz in meinem beispiel ist vom typ string* halt, und damit kann ich dann halt machen, was ich will.
|
|
|
|
|
|
|
| Zitat von flying sheep
jo, das hab ich missverständlich ausgedrückt. &baz in meinem beispiel ist vom typ string* halt, und damit kann ich dann halt machen, was ich will.
| |
Entweder du hast dich wieder falsch ausgedrückt, oder es noch nicht richtig verstanden.
baz ist vom Typ string. Über & greifst du auf die Adresse von baz zu. Das &-Zeichen gehört auch nicht zum Variablennamen oder ähnliches. Weiterhin ist das einzige, was vom Typ string* ist, der Parameter bar in der Funktion foo().
|
|
|
|
|
|
|
Natürlich hat der Ausdruck (&baz) den Typ string* in seinem Beispiel.
|
|
|
|
|
|
|
Ich denke man kann das nicht so wirklich festlegen. Klar steht dahinter ein Speicherplatz der einen String repräsentiert, aber ob der/ein "Ausdruck" jetzt einen Typen hat finde ich fragwürdig.
|
|
|
|
|
|
|
| Zitat von teK
Vor dem Gesetz sind alle Betriebssysteme gleich.
| |
Bester Untertitel!
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 11.07.2014 21:32]
|
|
|
|
|
|
| Zitat von Daddi89
Ich denke man kann das nicht so wirklich festlegen. Klar steht dahinter ein Speicherplatz der einen String repräsentiert, aber ob der/ein "Ausdruck" jetzt einen Typen hat finde ich fragwürdig.
| |
Klar haben Ausdrücke nen Typ...
/e: Das schreiben sie nichtmal explizit in den Standard rein, sondern setzten es vorraus (etwa 6.5 (6-7) 6.5.1 (2) im C-Standard [man kann einen Working Draft unter n1124 frei abrufen])
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 11.07.2014 21:43]
|
|
|
|
|
|
Habs durchgelesen, aber überzeugt mich nicht wirklich. &name zeigt eben nur auf eine andere Stelle bzw. weist etwas an (das Zurückgeben einer Speicheradresse). Die Variablen dahinter haben natürlich Typen, aber diese Anweisung ansich hat doch nicht wirklich einen Typen.
Im Endeffekt gibt es dafür wohl eh keine Definition und jeder kann das sehen wie er will, im Gebrauch der Sache machts ja eh keinen Unterschied
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Daddi89 am 12.07.2014 0:25]
|
|
|
|
|
|
natürlich hat das den typ:
|
Code: |
string foo = "...";
string * bar = &foo; |
|
|
|
|
|
|
|
|
Welchen der beiden hat &foo denn in dem Moment? string oder string*? Theoretisch beides, weil es die Anweisung gibt, die Adresse zurückzugeben und in einen Pointer zu packen.
Wenn ich sage:
int a = funktionDieIntZurueckGibt();
Dann hat die Funktion ja auch nicht den Typ int sondern den Typ Funktion. Ähnlich könnte man &variable, als eigenen Typen sehen. Es ist ja eh nur ne theoretische Überlegung. Ich sag nicht, dass ihr definitv falsch liegt, aber die Überlegung dahinter finde ich trotzdme interessant
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Daddi89 am 12.07.2014 2:27]
|
|
|
|
|
|
funktionDieIntZurueckGibt() ist ein funktionsaufruf.
funktionsaufrufe sind ausdrücke und haben wie alle ausdrücke einen typ.
&foo hat den typ string* , funktionDieIntZurueckGibt() hat den typ int
|
|
|
|
|
|
|
funktiondieintzurueckgibt ist ein function designator! Anwenden von () auf einen Designator ist - wie jede Anwendung eines Operators - eine Expression/Ausdruck und der hat _immer_ einen Typ.
(&foo) hat den Typ string *.
Warum? Weil der Operator & angewandt auf einen Typen T immer den Typen T* zurückgibt. Wenn dir das gedanklich hilft: & ist quasi ein template auf sprachebene.
| Zitat von Daddi89
Welchen der beiden hat &foo denn in dem Moment? string oder string*? Theoretisch beides, weil es die Anweisung gibt, die Adresse zurückzugeben und in einen Pointer zu packen.
| |
Könntest du das etwas ausführen? Wieso "theoretisch beides"?
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 12.07.2014 2:51]
|
|
|
|
|
|
Okay, wenn man davon ausgeht, dass eine Funktion die int zurückgibt selbst auch den Typ int hat, dann ist das natürlich genauso auch auf den & Operator anzuwenden. Meine Überlegung war lediglich, ob man sowas wie den & Operator oder Funktionen als einen eigenen Typen ansehen könnte.
|
|
|
|
|
|
|
Sind sie doch. Heißt Function (Type).
Function Type => Spezifikation von Rückgabewert und Parametern
Function Designator => Eindeutige spezifikation Bennenung (e: also nicht zu verwechseln mit einer Definition oder Deklaration) einer bestimmten Funktion.
D.h. funktionblar ist ein function designator, und dessen Typ ist immer den Typ der designierten Funktion gleich.
Jetzt gibt es den Operator (). Der ist nur auf einen Function Designator anwendbar. Der Operator hat als Typ den Rückgabewert, der durch den Function Type des Designators spezifiziert wird.
Im Standard findest du genaue Definitionen zum Typsystem in 6.2.5
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von csde_rats am 12.07.2014 3:50]
|
|
|
|
|
|
in scala haben funktionen z.b. den typ Function0[R] , Function1[P1, R] , Function2[P1, P2, R] , … (in scala sind generische typen in [] statt <>
…wobei P1 usw. die parametertypen sind, und R der rückgabetyp.
wenn man die funktionen jetzt ausführt per somefunction(param1, param2, ...) hat dieser ausdruck den typ R .
beispiel (mit einem fiktionalem typeof-operator):
|
Code: |
def add(a: Int, b: Int) : Int { return a + b }
assert typeof add == Function3[Int, Int, Int]
assert typeof add(2, 3) == Int |
|
|
|
|
|
|
|
|
Sehr interessant, wieder was gelernt
Kommt davon, wenn man jahrelang nur typen-loses PHP verwendet :S
|
|
|
|
|
|
|
| Zitat von Daddi89
typen-loses PHP
| |
Das tut auch nur so.
|
|
|
|
|
|
|
Schwaches, dynamisches Duck-Typing kann man genauso gut auch als typen-los bezeichnen
In PHP 5.3 und drüber wirds besser, aber wenn man damals damit arbeiten musste konnte man das doch vergessen.
|
|
|
|
|
|
Thema: 100 gute Gründe für Linux ( v0.30 gute Gründe für systemd ) |