2016-05-29 11 views

Antwort

3

a*b Der Operator soll ein neues Objekt zurückgeben, keine Referenz auf a.

korrekte Syntax ein operator* innerhalb der Klasse zu erklären ist:

class Mat 
{ 
    .. 
    .. 
    .. 
    Mat operator*(int elem){ 
     Mat res = *this; 
     res.multiWith(elem); 
     return res; 
    } 
}; 

Dann Typ des linken Parameters ist zwingend die aktuelle Klasse (hier: linke Parameter von a*b notwendigerweise eine Mat Instanz).

Nun, wenn Sie an die Betreiber außerhalb der Klasse deklarieren, können Sie jede Art für linke und rechte Parameter zur Auswahl:

class Mat 
{ 

}; 

Mat operator*(const Mat& left,int right){ 
    Mat res; 
    // do res=left*elem 
    return res; 
} 

Mat operator*(int left,const Mat& right){ 
    Mat res; 
    // do res=left*right 
    return res; 
} 
+0

und was ist, wenn die Mat Vorlage ist ... Wie kann ich die aus meinen Klassenoperatoren schreiben? – JohnnyF

+0

@JohnnyF: Das sollte wahrscheinlich eine separate Frage sein, da OP das nicht erwähnt hat. Fügen Sie jedoch vor der Operator-Deklaration einfach die Vorlage <...> hinzu. Eine extern für eine Klasse deklarierte Operation kann eine Vorlage sein. – jpo38

+0

@ downvoter, bitte erarbeiten ... – jpo38

1

es jetzt 2 für m1 * funktioniert, aber wie es funktioniert mit 2 * m1

Sorgen Sie für eine weitere Überlastung.

class Mat 
{ 
.. 
    friend Mat operator*(const Mat& s1, int elem) { 
     Mat ret = s1; 
     ret.multiWith(elem); 
     return ret; 
    } 
    friend Mat operator*(int elem, const Mat& s1) { 
     return s1 * elem; 
    } 
}; 

BTW1: operator* sollte Mat als Wert zurückgeben, nicht Bezug genommen wird.
BTW2: Sie können den Parametertyp von s1 in const-Referenz ändern, um das Kopieren zu vermeiden.
BTW3: Wenn Mat::multiWith ist nicht privateoperator* müssen nicht friend sein.

+0

aussehen wie es funktionieren wird, wird V nach der Überprüfung, wenn ich nach Hause komme, ty – JohnnyF