Question

Je sais que c'est une bonne idée de faire autant de l'interface d'une classe non-membre non-ami que possible, et je viens de réaliser que, pour ma classe de vecteur 3D, « Vector3 », je peux déplacer la + =, -. = et ainsi les opérateurs hors de la classe, ne laissant que les constructeurs et l'opérateur d'affectation de copie

La question est: ce que ce regard de l'opérateur devrait comme? Je l'ai vu des formes canoniques de beaucoup d'autres opérateurs et ont suivi leurs conseils, mais je ne l'ai pas vu des formes canoniques de ces opérateurs. J'ai donné ce que je pense qu'il devrait être ci-dessous.

La question secondaire est: ce sont ces opérateurs ont même appelé? opérateurs d'affectation arithmétique?

Le code (pertinent) avant:

class Vector3 {
public:
    Vector3& operator+=(const Vector3& rhs);
    float x, y, z;
};

Vector3& Vector3::operator+=(const Vector3 &rhs) {
    x += rhs.x;
    y += rhs.y;
    z += rhs.z;

    return *this;
}

Ce que je l'ai changé pour ce jour:

class Vector3 {
public:
    float x, y, z;
};

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
    lhs.x += rhs.x;
    lhs.y += rhs.y;
    lhs.z += rhs.z;

    return lhs;
}
Était-ce utile?

La solution

Qu'est-ce que vous avez me semble bon.

Par ailleurs, quand vous venez à l'opérateur +, il est courant de mettre en œuvre qu'en termes de + =. (Créer une copie de LHS, puis appelez LHS + = rhs et retourner le résultat)

Je ne sais pas si vous êtes déjà au courant de cette affaire, mais puisque vous êtes préoccupé par les moyens canoniques pour mettre en œuvre ces opérateurs, il ne peut pas faire du mal à en parler. :)

Autres conseils

Qu'est-ce que vous avez l'air bien.

La méthode de base pour penser à cela, intuitivement, est de penser à ce que vous aimeriez code comme quand vous écrivez. Si, dans ce cas, vous pouvez écrire

Vector v, w;

v += w;
w += v;

et ainsi de suite, vous êtes sur la bonne voie.

Il y a beaucoup de bonnes règles de base pour aider; voir cette entrée dans le C ++ FAQ pour beaucoup là-dessus.

Je ne dirais pas « autant de l'interface que possible ». Il n'y a pas grand-chose à gagner en faisant operator+=, etc. non operator-= membres non-ami.

Certaines personnes préfèrent faire toutes les fonctions possibles d'un non-membre fonction non-ami pour résister à la tentation d'utiliser des variables membres privées. Mais vous êtes un adulte: vous pouvez écrire la fonction en tant que membre du public, et ne pas utiliser les variables membres privées. Je préfère savoir que la fonction est liée à la classe, et ce qui en fait un membre du public fait explicite.

Remarque En plus:
Personnellement, je trouve qu'il est souvent correct d'utiliser les députés au lieu de accesseurs publics (je sais - je vais brûler en enfer). Pas toujours! - mais souvent
. En fait, il y a peu de cas où vous ne pourriez pas faire le passage à accesseurs publics d'une manière de minutes si vous décidez besoin. Mais je reconnais que ce n'est pas une vue populaire et je ne demande pas aux gens de suivre cette philosophie.

Il y a des raisons concrètes pour certaint Fonctions et opérateurs "non-ami, non-membres". Par exemple, l'opérateur << () lorsqu'il est utilisé comme « opérateur flux d'insertion » ne peut pas être fait membre parce que vous devez changer la classe LHS (le flux).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top