kostenloser Webspace werbefrei: lima-city


Implizites Casting für eigene Klasse

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    m******s

    Moin,

    also, wenn man ne Funktion hat wie z.B.
    void myFunc(double param)
    {
        /* ... */
    }

    Dann wird ja bei einem Aufruf von z.B.
    myFunc(5)

    der int 5 implizit in einen double gecastet.
    Ich wollte mal fragen, ob man so ein Verhalten auch für eigene Klassen definieren kann? Also, man hat zwei Klassen und definiert eine Funktion, die auferufen werden soll, wenn sowas wie ein impliziter Cast gemacht werden soll...
    Wenn man nämlich will, dass jeweils bei den Funktionen Objekte beider Klassen verwendet werden können, müsste man sonst alle Methoden einzeln überladen, was ja deutlich unbequemer wäre, als einmal festzulegen, wie die Umwandlung geschieht...
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Dieses implizite Casten macht C++ eigentlich immer(*):
    #include <iostream>
    
    class doof {
    	public:
    	doof( int a ) {
    		std::cout << "int constructor" << std::endl;
    	}
    };
    
    int main() {
    	float b = 5.2;
    	doof foo( b );
    	return 0;
    }

    Oder meinst du etwas anderes?


    (*) und ich finde das doof, da sich so leicht Fehler einschleichen können.
  4. Autor dieses Themas

    m******s

    bladehunter schrieb:
    Dieses implizite Casten macht C++ eigentlich immer(*):
    #include <iostream>
    
    class doof {
    	public:
    	doof( int a ) {
    		std::cout << "int constructor" << std::endl;
    	}
    };
    
    int main() {
    	float b = 5.2;
    	doof foo( b );
    	return 0;
    }

    Oder meinst du etwas anderes?


    Jupp, ich mein was anderes.

    class foo
    {
        private:
            // some members
        public:
            // some more members
    }
    
    class bar
    {
        private:
            // other members
        public:
            // more orther members
    }
    
    foo myFunc (foo param)
    {
        foo tmpFooObj;
        // stuff and such
        return foo;
    }
    
    int main()
    {
        bar ladida;
        ladida = myFunc(ladida);
    }


    Verständlich? Also, dass ein bar-Objekt implizit in ein foo-Objekt und wieder zurück gecastet wird (wenn sich beide logisch ineinander umwandeln lassen). Man könnte natürlich auch vier verschiedene "myFuncs" schreiben, jeweils foo->bar, foo->foo, bar->bar und bar->foo, aber das wird schnell lästig.
    Man könnte auch ne Umwandlungsfunktion schreiben, und die dann ggf. aufrufen, aber genau das will ich ja umgehen und sone Funktion automatisch aufrufen lassen, wenns nötig ist (wie der Compiler das in dem von mir (und dir) geschilderten Fall mit int und double/float oder was für Zahlentypen auch immer macht).
    Eigentlich müsste das ja gehen, weil ja z.B. auch ein String automatisch in ein char* gecastet wird, wenns nätig ist (auch wenns dafür ne Warning gibt).

    Beitrag zuletzt geändert: 20.3.2009 15:48:57 von merovius
  5. Okay, hast du dich schon mit Templates auseinander gesetzt? Damit müsstest du eine generische Funktion schreiben können, die mit beiden Klassen klarkommt.

    http://www.cplusplus.com/doc/tutorial/templates.html
    (Siehe die Funktionstemplates)

    Die Vorraussetzung für die Verwendung von Funktionstemplates ist natürlich, dass die beiden Klassen einigermaßen ähnlich sind.

  6. Autor dieses Themas

    m******s

    bladehunter schrieb:
    Okay, hast du dich schon mit Templates auseinander gesetzt? Damit müsstest du eine generische Funktion schreiben können, die mit beiden Klassen klarkommt.

    http://www.cplusplus.com/doc/tutorial/templates.html
    (Siehe die Funktionstemplates)

    Die Vorraussetzung für die Verwendung von Funktionstemplates ist natürlich, dass die beiden Klassen einigermaßen ähnlich sind.


    Hm, die müssten ja aber afaik schon sehr ähnlich sein... Vielleicht ist das ne Möglichkeit, muss ich noch mal drüber kontemplieren...
    Es geht übrigens genauer darum, dass ich zwei verschiedene Koordinatensysteme habe. in bestimmten Funktionen müssen halt die einen Koordinaten verwendet werden, in anderen Funktionen halt die anderen. Implizite Umwandlung wäre halt ne Super-elegante Lösung, man könnte dann einfach übergeben, was man hat und die Fkt. kümmert sich selbst um die Koordinatentransformation...

    Wer also eine elegantere Lösung hat, immer her damit ;)
  7. t*****b

    Wenn es sich um die verschiedenen Daten um die Daten eines gleichen Types handelt, könntest du auch einen Array übergeben, ich würde aber Überladung bevorzugen.
  8. c*****s

    #include <iostream>
    using namespace std;
    class A
    {
          public:
                 int x;
                 };
    
    class B
    {
          public:
                 int x;
                 operator A(){
                          A a;
                          a.x = -x;
                 }
                 };
                 
    void fun(A a){
         cout << a.x;
         }
    
    int main()
    { B b;
    b.x = 3;
    fun(b);
    system("PAUSE");
    return 0;
    }
  9. Autor dieses Themas

    m******s

    @caiexus:

    Scheint zu passen (macht, was ich will und läuft korrekt).
    Meld mich nochmal, falls es doch nicht will, wie ich will, danke auf jeden Fall, das scheint perfekt zu sein.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!