Implizite Konvertierung



  • Hallo,
    ich habe folgendes Problem:
    Ich habe ein String-Klasse die mit einem normal C-String erzeugt werden kann. Desweiteren habe ich eine Werte-Klasse die verschiedene Werte, unter anderem meine String-Klasse beinhalten kann. Dann habe ich eine Klasse die die Werte Klasse benutzt. Diese Klasse hat als Parameter einer Methode die Value Klasse. Ich möchte nun die Test Klasse einfach mit einem String aufrufen können. Hier ein Beispiel dazu:

    class TestString {
        public:
            TestString(const char* arg) { }
    };
    
    class TestValue {
        public:
            TestValue(const TestString& arg) { }
    };
    
    class TestClass {
        public:
            TestClass() { }
            void testMethod(const TestValue& arg) { }
    };
    
    int main() {
    
        TestClass foo;
        foo.testMethod("bar");
        return 0;
    }
    

    Leider wird der C-String nicht automatisch konvertiert, der Compiler meldet
    error: no matching function for call to ‘TestClass::testMethod(const char [4])’
    note: candidate is: void TestClass::testMethod(const TestValue&)

    Wenn ich den String explizit in ein Value umwandle funktioniert es

    foo.testMethod(TestValue("bar"));
    

    Wie kann ich schaffen als Parameter einfach einen String anzugeben.

    Vielen Dank für eine Antwort
    Mit freundliche Grüßen
    Lukas



  • Erlaubt es dein Design nicht, dass du einfach eine überladene Version TestClass:: testMethod(const TestString& arg) definierst?



  • entweder so:

    foo.testMethod(TestValue(TestString("bar")));
    

    oder du schreibst einen neue testMethod die für TestClass der einen String annimmt.



  • Hallo,
    ich könnte schon ein Methode

    TestClass:: testMethod(const TestString& arg)
    

    definieren, allerdings ist das umständlich da die Value Klasse auch noch andere Typen beinhalten kann und ich somit für jeden Typ eine extra Methode schreiben müsste.
    Warum wird denn der C-String nicht automatisch konvertiert, also von
    C-String nach TestString und dann nach TestValue?

    Grüße
    Lukas



  • Weil dies ein Schritt zu viel der impliziten Konvertierung ist. Wenn du z.b.

    TestValue(const char* arg) { }
    

    hinzufügst wirst du sehen, dass du einfach

    foo.testMethod("bar");
    

    schreiben kannst. Eine implizite Konvertierung ist OK für den Kompiler, aber zwei macht er nicht!


Anmelden zum Antworten