Verträglichkeit zweier Typen



  • Pellaeon schrieb:

    Ist der Parameter eine const-Referenz oder ein call by value?

    Eine const Referenz.

    Pellaeon schrieb:

    An sich würde ich aber eher zu einem expliziten Cast raten. Das ein int automatisch zu deiner Klasse werden kann, kann dir auch auf die Füße fallen.

    Die int Sachen habe ich auch implementiert, nur nicht mit angegeben in meinem vorrangegangenen Post. Wie gesagt es war alles schon mit unsigned int implementiert. Ein cast würde so um die 500 Änderungen nach sich ziehen, da bin ich zu faul. Die Umwandlung in eine eigne Klasse hat auch mehr ideelle Gründe:-)

    Pellaeon schrieb:

    Normalerweise macht man bei sowas den Konstruktor "explicit"

    Das hat scheinbar nicht gewirkt:-(

    Ciao
    Timo



  • Okay habs jetzt hinbekommen.

    Habe folgende Methoden überschrieben:

    class NodeID_t
    {
    public:
    	NodeID_t();
    	NodeID_t(const NodeID_t& rs);
    	explicit NodeID_t(const unsigned int& id);
    	NodeID_t(unsigned int rs);
    	explicit NodeID_t(const int& rs);
    	NodeID_t(int rs);
    	bool operator==(const NodeID_t& rs) const;
    	bool operator==(const unsigned int rs) const;
    	bool operator==(const int rs) const;
    	friend bool operator==(const unsigned int& ls, const NodeID_t& rs);
    	friend bool operator==(const int& ls, const NodeID_t& rs);
    	bool operator!=(const NodeID_t& rs) const;
    	bool operator!=(const unsigned int rs) const;
    	bool operator!=(const int rs) const;
    	friend bool operator!=(const unsigned int& ls, const NodeID_t& rs);
    	friend bool operator!=(const int& ls, const NodeID_t& rs);
    	NodeID_t& operator=(const NodeID_t& rs);
    	NodeID_t& operator=(unsigned int rs);
    	NodeID_t& operator=(int rs);
    	operator unsigned int () const;
    	operator int () const;
    };
    


  • Wieso machst du eigentlich vom selben Operator ( == , != ) gewisse Überladungen global und gewisse als Member? Ich würde die einheitlich global machen. Oder wenn du es schon so machst, kannst du das friend weglassen, indem du bei den globalen Operatoren auf die Member-Operatoren zugreifst.

    Und das const bei Parameter von skalaren Typen (z.B. const unsigned int ) ist auch eher unüblich und nicht wirklich nötig, da das Argument sowieso kopiert wird. Was bezweckst du eigentlich mit Konstruktoren für int und const int& ? Das führt zu Mehrdeutigkeiten beim Aufruf.



  • Ehrlich gesagt kann ich Dir darauf nicht antworten. Mangels ausreichender Kenntnisse habe ich einfach alles überschrieben, was mir einfiel, bis die Kompilerfehler verschwunden waren, ohne das ich casten musste. 😞

    Ich oute mich hiermit als Anfänger!

    Ciao
    Timo



  • Mach das explicit wieder weg! Du *willst* ja den automatischen Cast. Das explicit macht genau das Gegenteil^^
    Und wie schon drüber erwähnt: "const int&" macht auch nicht wirklich Sinn. EInfach nur "int" reicht (generell bei den Grundtypen, also auch bei float und unsigned usw.)



  • Alles klar.



  • Pellaeon schrieb:

    Und wie schon drüber erwähnt: "const int&" macht auch nicht wirklich Sinn. EInfach nur "int" reicht (generell bei den Grundtypen, also auch bei float und unsigned usw.)

    Es macht nicht nur keinen Sinn, sondern sollte auch wie erwähnt zu Mehrdeutigkeiten führen. Mich wundert, dass das scheinbar geklappt hat. Wurde der Konstruktor überhaupt jemals aufgerufen?



  • Nexus schrieb:

    Wurde der Konstruktor überhaupt jemals aufgerufen?

    Scheinbar nicht. Wie schon geschrieben, ich habe einfach alles überschrieben, was mir einfiel, bis alle Kompilerfehler weg waren. Vieles davon ist sicher überflüssig. Aber was, das wißt nur ihr.

    Danke an alle, die mir helfen!

    Ciao
    Timo



  • Gut, dann nimm aber auch noch die mehrdeutigen Überladungen weg, wenn du nicht gleich wieder Compilerfehler haben willst. 😉



  • Nexus schrieb:

    Wieso machst du eigentlich vom selben Operator (==, !=) gewisse Überladungen global und gewisse als Member? Ich würde die einheitlich global machen. Oder wenn du es schon so machst, kannst du das friend weglassen, indem du bei den globalen Operatoren auf die Member-Operatoren zugreifst.

    Jetzt hab ich es gemerkt 🙂 Das sollten die Umkehrfunktionen sein, also wenn NodeID_t nicht rechts steht beim Vergleich. Hab jetzt aber gesehen, dass ich sie falschrum definiert habe.
    Das mit dem nicht friend, hab ich übernommen.

    Ciao
    Timo


Anmelden zum Antworten