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;
}
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top