Unterscheidung von Memberfunktionen

09/07/2014 - 16:48 von Christian Keck | Report spam
Moin,

ich habe eine Klasse geschrieben, die Parameter für ein Programm
verwaltet. Jetzt stehe ich vor dem Ràtsel, warum bei dem Aufruf

Insert("Kamera", "uEye", "1153");

nicht die von mir vorgesehene Memberfunktion

void Insert(const std::string& sgroup, const std::string& skey,
const std::string& sset, bool bprotect = false)

sondern die Memberfunktion

void Insert(const std::string& sgroup, const std::string& skey,
const bool bset, const bool bprotect = false)

aufgerufen wird, die für den Aufruf

Insert("Kamera", "uEye", false);

vorgesehen ist. Ich habe die Quellen sowohl mit Microsft VisualC++ als
auch mit GCC (Ubuntu 12.04 LTS) übersetzt. Das übersetzte Programm
verhàlt sich in beiden Fàllen gleich.

Christian
 

Lesen sie die antworten

#1 Daniel Krügler
09/07/2014 - 20:03 | Warnen spam
Am Mittwoch, 9. Juli 2014 16:48:40 UTC+2 schrieb Christian Keck:
Moin,

ich habe eine Klasse geschrieben, die Parameter fï¿oer ein Programm
verwaltet. Jetzt stehe ich vor dem Rï¿oetsel, warum bei dem Aufruf

Insert("Kamera", "uEye", "1153");

nicht die von mir vorgesehene Memberfunktion

void Insert(const std::string& sgroup, const std::string& skey,
const std::string& sset, bool bprotect = false)



Um diese Funktion mit obigen Argumenten aufzurufen, ist für sset eine sog. benutzer-definierte Konvertierung (const char* -> std::string) erforderlich, da std::string einen Konstruktor der Form

std::string::string(const char*);

anbietet (Ich betrachte hier nur sset, aber die gleiche Argumentation gilt auch für die vorhergehenden Parameter. Da diese aber gleich sind bei beiden Funktionen, reicht es, wenn wir uns hier auf den einzigen Unterschied konzentrieren).

sondern die Memberfunktion

void Insert(const std::string& sgroup, const std::string& skey,
const bool bset, const bool bprotect = false)



Um diese Funktion mit obigen Argumenten aufzurufen, reicht für Parameter bste schon eine sog. Standard-Konvertierung, die in diesem Fall aus den beiden Unterschritten:

- Feld-zu-Zeiger-Konvertierung (Aus const char[5] wird const char*)
- Bool'sche Konvertierung (Aus const char* wird der Boolsche Wert true)

Bei der sog. Überladungsauswahl werden beide miteinander verglichen. Wenn bei einer Überladung eine sog. Standard-Konvertierungssequenz ausreicht, ist diese eine bessere Konvertierungs-Sequenz als eine mit einer benutzerdefinierten Konvertierung, daher die Bevorzugung dieser zweiten Form.

Das ist eine ziemliche Falltür in diesem speziellen Fall. Eine mögliche Lösung ist, dass du zusàtzlich die Überladung

void Insert(const std::string& sgroup, const std::string& skey,
const char* sset, bool bprotect = false);

bereitstellen würdest, die du dann an die gleiche Funktionalitàt lenkst, wie die allererste Form. Hier ist dann auch nur eine (bessere) Standardkonvertierungs-Sequenz notwendig, die bloss aus dem einzigen Schritt

Feld-zu-Zeiger-Konvertierung (Aus const char[5] wird const char*)

besteht, und damit besser ist als die von Überladung Nummer Zwo.

Besten Gruss aus Bremen,

- Daniel Krügler

Ähnliche fragen