Pergunta

Agora eu estou usando std :: pair para representar um ponto 2D em C ++. No entanto, estou ficando irritado com ter que escrever

typedef std::pair<double, double> Point;

Point difference = Point(p2.first - p1.first,
                         p2.second - p1.second);

em vez de ser capaz de operador de sobrecarga + e operador -.

Então, minha pergunta é, para fazer minha classe Point, que eu deveria

  • publicamente derivam de std :: pair e adicionar minhas próprias funções de membro? Isso é bom porque todo o meu código pode permanecer o mesmo. Eu não vou estar fazendo qualquer coisa como std::pair<double, double>* p = new Point; então eu não precisa se preocupar com coisas como destruidores virtuais.
  • Role minha própria classe Point, que é irritante desde que eu estou duplicar a funcionalidade do std :: pair, no entanto eu estou "fazendo isso da maneira pura".
  • especializações Modelo Faça de operador + e do operador para std :: pair, que é certo que não me lembro se eles vão nos arquivos de origem ou de cabeçalho.

Eu acho que é motivo de debate, eu realmente gostaria de fazer # 1, mas eu não sei se é uma má idéia desde que eu ouvi que herdando de STL é um não-não.

Foi útil?

Solução

Você poderia rolar sua própria classe Point, mas o uso std :: pair internamente para armazenar os dados. Isso impede que a herança da questão STL, mas ainda usa std :: funcionalidade do par.

Outras dicas

Melhor do que rolar seus próprios: agarrar um livre biblioteca Vector / Ponto existente. Uma recomendação: aquele ligado a Matemática Essencial para Jogos Programadores . Você pode usar qualquer biblioteca que você encontrar como um ponto de partida, em seguida, otimizar / especializar / ajuste de lá.

Eu seria a favor da criação de sua própria classe Point e utilização a herança privado ou composição, se você quiser std :: empregar a funcionalidade do par. O problema com o typedef (como eu tenho certeza que você está ciente) é que qualquer função que você escrever que tem um ponto também será utilizável por qualquer coisa representado como um std :: pair , que pode não ser válido.

Com isto em mente, outra opção existe de apenas criar algumas funções construtor livre como

Point addPoints(const Point& p1, const Point& p2);
Point diffPoints(const Point& p1, const Point& p2);

(os nomes das funções poderia ser melhor).

Uma outra opção poderia ser a de fazer você possui classe Point, e ter sua classe "possuir" um std :: pair que representa as coordenadas do ponto.

Muitas vezes um "tem um" relacionamento (composição) é preferível sobre uma "é um" relacionamento (herança).

Eu acho que "Melhores Práticas" diria para rolar sua própria classe Point. Dessa forma, você pode fazê-lo em 3D muito mais fácil na estrada.

herança Privada aka herança de implementação, é seu amigo.

Esta é uma consequência lógica: a questão não é um std :: pair, você não quer ter uma conversão up-cast pública do ponto de std :: pair, mas você quer usar std :: internas do par.

A outra possibilidade é a uma tem-um relacionamento, ou composição:. Cada ponto tem-a privbate std :: pair ele usa internamente

Na verdade, não há muita diferença entre composição e herança privada, exceto que no último você pode forçar um up-cast para std :: pair em uma função membro Point.

Roll sua própria classe Point. Isto irá permitir que você faça uma série de coisas com ele no futuro. Especificamente, eu ter resolvido esse tipo de problema antes, eo que eu encontrei para ser útil é definir a minha própria estrutura Point, e criar uma classe Point que herda a partir dele.

Divulgação completa: Eu não gosto do STL muito

.

Do not herdar publicamente de std :: pair porque std :: pair tem um operador <, mas o seu ponto não deveria ter.

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