String passing by reference ==> konstanter String möglich?
-
Guten Abend. Sorry, dass ich schon wieder nen komischen Thread aufmachen muss (das andere Problem hat sich automatisch nach einem Neutart behoben (wtf?)).
Ich benutze momentan den minGW-Compiler mit Code::Blocks.
Foldendes funtkioniert nicht:Das hier ist mein Klasse mit der Methode setText.
class CButton : public CControl { public: //... //Setter void setText(std::string &text) {_text = text;} private: std::string _text; //... };Nun möchte ich die Methode setText mit einem konstanten String aufrufen:
CButton *button = NULL; button = new CButton(100, 100, 200, 30, text, 1, bgImage); button->setText(std::string("hallo"));Leider funktioniert dies nicht. Unter MSVC++ hat dies afaik immer funktioniert.
Ich könnte dieses Problem natürlich durch eine Überladung beheben, aber ich finde es irgendwie schon komisch, dass meine Syntax nicht akzeptiert wird und ich möchte auch gerne den Grund dafür wissen.main.cpp||In function 'int SDL_main(int, char**)':| main.cpp|18|error: no matching function for call to 'CButton::setText(std::string)'| CButton.h|23|note: candidates are: void CButton::setText(std::string&)| ||=== Build finished: 1 errors, 0 warnings ===|Offensichtlich hat er also ein Problem damit, meinen String zu einer Referenz zu "konvertieren".
-
Das temporäre Objekt kann nicht an eine Referenz, sondern nur an eine const-Referenz gebunden werden.
void setText(const std::string &text)
-
Ach, bevor ich es vergesse:
button->setText("hallo");Dies ergibt folgende Ausgabe:
In function 'int SDL_main(int, char**)':| main.cpp|18|error: no matching function for call to 'CButton::setText(const char [6])'| CButton.h|23|note: candidates are: void CButton::setText(std::string&)| ||=== Build finished: 1 errors, 0 warnings ===|
-
Unter MSVC++ hat dies afaik immer funktioniert.
Das wäre laut Standard ill-formed, wie soll das jemand kompiliert haben sollen?
ich möchte auch gerne den Grund dafür wissen.
Soll ich den Standard zitieren?
Oder willst du eine Erklärung wieso das überhaupt keinen Sinn macht?
-
Sone schrieb:
Unter MSVC++ hat dies afaik immer funktioniert.
Das wäre laut Standard ill-formed, wie soll das jemand kompiliert haben sollen
MS Compiler haben eine Extension dafür. Unter Warning Level 4 wird bei der Verwendung auch gewarnt.
-
Danke für die wirklich superschnelle Hilfe.
Ich habe noch eine weitere Frage.
Warum darf ich diesen Code hier kompillieren:#include <iostream> using namespace std; int main() { cout << (1+ +1) << endl; //wtf? return 0; }aber diesen nicht?
#include <iostream> using namespace std; int main() { cout << (1++1) << endl; return 0; }Mathematisch gesehen müssen Rechenoperatoren doch eh durch eine Klammer abgetrennt werden bzw. dürfen nicht direkt hintereinander stehen, oder?
-
(1+ +1)
Hier wird das zweite + als unärer Operand angesehen. Er bewirkt, dass die zweite Eins positiv ist, er steht also für das Vorzeichen. Im Endeffekt steht da also
(1 + 1)oder2(1++1)
Hier sind die zwei Pluszeichen der Präfix-Inkrement Operator (Edit: Oder Postfix? Aber das ist auch egal). Und was denkst du, ob
(1 2)ein gültiger Ausdruck ist? Genau so gültig ist(1++1)...
-
Mathematisch gesehen müssen Rechenoperatoren doch eh durch eine Klammer abgetrennt werden bzw. dürfen nicht direkt hintereinander stehen, oder?
C++ hält sich nicht an alle Grundregeln der Mathematik.
Mathematisch heißt das erste:
1+(+1)
-> das zweite + ist ein VorzeichenBeim zweiten versucht der Compiler (hoffnungslos) aus dem ++ einen Inkrementoperator (Postinkrement) zu machen, was aber nur mit einer lvalue geht.
-
Also um mal hier bei der string Sache zu bleiben ich habe das/ein "selbe"/"ähnliches" Problem ...
evtl. steh ich auch auf dem Schlauchmein Code Class:
void form (const std::string &a) { std::cout << "Ich bin die Ausgabe ! " << a << std::endl; }########################################################
** Edit FEHLER GEFUNDEN :void KLASSE::form (const std::string &a) { std::cout << "Ich bin die Ausgabe ! " << a << std::endl; }da war mein Fehler danke
-> doch geschwollene Augen 
########################################################
Code des "aufrufs" aus der main :
Formater *ptr_formater; ptr_formater = new Formater(); std::string varString = "TATATA"; ptr_formater->form(varString);Ausgabe :
/tmp/cczMB7Q5.o: In function `main': main.cpp:(.text+0x591): undefined reference to `Formater::form(std::string const&)' collect2: error: ld returned 1 exit statusalso das mit dem const Ref geht auch nicht -> oder meine Augen sind so geschwollen das ich nichts mehr mitbekomme

danke schon mal vor ab
Achja eine Erklärung wäre supi
mfg guest054