Canónica de + = operador para classes
-
22-08-2019 - |
Pergunta
Eu sei que é uma boa idéia para fazer o máximo de interface de um não-amigo não-membro da classe quanto possível, e eu só percebi que para minha classe vector 3D, 'Vector3', eu posso mover o + =, -. = e assim por diante operadores fora da classe, deixando apenas construtores e o operador de atribuição de cópia
A pergunta é: o que deve este operador parece? Eu vi formas canônicas de muitas outras operadoras e ter seguido os seus conselhos, mas eu não vi formas canônicas destes operadores. Eu dei o que eu acho que deveria ser a seguir.
A questão secundária é: o que são esses operadores mesmo chamado? operadores de atribuição aritmética?
O código (relevante) antes:
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;
}
O que eu mudei-lo para tão longe:
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;
}
Solução
O que você tem parece ser bom para mim.
A propósito, quando você vem para o operador +, é comum para implementar que em termos de + =. (Criar uma cópia de LHS, e depois chamar LHS + = rhs e retornar o resultado)
Não sei se você já está ciente deste truque, mas desde que você está preocupado com formas canônicas para implementar esses operadores, não pode ferir a mencioná-lo. :)
Outras dicas
O que você tem boa aparência.
O curso básico de pensar sobre isso, intuitivamente, é pensar sobre o que você gostaria de código para olhar como quando você escrevê-lo. Se, neste caso, você pode escrever
Vector v, w;
v += w;
w += v;
e assim por diante, você está no caminho certo.
Há um monte de boas regras de ouro para ajuda; consulte este entrada no ++ FAQ C para os lotes sobre ele.
Eu não diria que "tanto a interface quanto possível". Não há muito a ser adquirida, fazendo operator+=
, operator-=
etc. um Amigo não não-membro.
Algumas pessoas preferem fazer todas as funções possíveis função não-amigo de um não-membro de resistir à tentação de usar variáveis ??de membro privadas. Mas você é um adulto: você pode escrever a função como um membro do público, e não usar as variáveis ??de membro privadas. Eu prefiro saber que a função está ligada à classe, e tornando-se um membro do público torna explícito.
Além note:
Pessoalmente, acho que muitas vezes é OK para usar os membros privados em vez de acessores públicos (eu sei - eu vou queimar no inferno). Nem sempre! -., Mas muitas vezes
Na verdade, existem alguns casos em que você não poderia fazer a troca de acessores públicos em questão de minutos se você decidir que precisa. Mas reconheço que não é uma visão popular e eu não pedir às pessoas que seguem essa filosofia.
Há razões concretas para tornar CertainT funções e operadores "não-amigo, não-membro". Por exemplo, o operador << () quando usado como o "operador stream-inserção" não pode ser um membro porque você teria que mudar a classe LHS (o fluxo).