Создание класса Point в C++
прямо сейчас я использую std:: pair для представления 2d-точки на c++. Тем не менее, меня раздражает необходимость писать
typedef std::pair<double, double> Point;
Point difference = Point(p2.first - p1.first,
p2.second - p1.second);
вместо того, чтобы перегружать operator+ и operator-.
Итак, мой вопрос в том, чтобы сделать мой класс Point, должен ли я
- публично наследовать от std::pair и добавить мои собственные функции-члены? Это хорошо, потому что весь мой код может оставаться неизменным. Я не собираюсь делать ничего подобного!--1--> поэтому мне не нужно беспокоиться о таких вещах, как виртуальные деструкторы.
- сверните мой собственный класс точек, который раздражает, так как я дублирую функциональность std::pair, однако я "делаю это чистым способом".
- сделайте специализации шаблонов operator+ и operator-для std:: pair, которые, по общему признанию, я не помню, входят ли они в исходные или заголовочные файлы.
Я думаю, это для обсуждения, я бы очень хотел сделать #1, но я не знаю, если это плохая идея, так как я слышал, что наследование от STL нет-нет.
8 ответов
вы можете свернуть свой собственный класс точек, но использовать std::pair внутренне для хранения данных. Это предотвращает наследование от проблемы STL, но по-прежнему использует функциональность std::pair.
лучше, чем собственное: захватите существующий вектор библиотека/точка. Одна рекомендация: та, которая прилагается к необходимая Математика для программистов игр. Вы можете использовать любую библиотеку, которую найдете в качестве отправной точки, а затем оптимизировать / специализировать / настраивать оттуда.
Я бы предпочел создать свой собственный класс точек и использовать частное наследование или композицию, Если вы хотите использовать функциональность std::pair. Проблема с typedef (как я уверен, вы знаете) заключается в том, что любая функция, которую вы пишете, которая берет точку, также будет использоваться всем, что представлено как std::pair
имея это в виду, существует еще один вариант создания некоторых бесплатных функций builder как
Point addPoints(const Point& p1, const Point& p2);
Point diffPoints(const Point& p1, const Point& p2);
(имена функций могут быть лучше).
еще один вариант может заключаться в том, чтобы сделать вас владельцем класса Point и иметь свой класс "own" std::pair, который представляет координаты точки.
много раз отношение" имеет " (композиция) предпочтительнее отношения "является" (наследование).
Я думаю, что "лучшие практики" сказали бы свернуть свой собственный точечный класс. Таким образом, вы можете сделать его 3D намного проще по дороге.
частное наследование aka наследование реализации, является вашим другом.
Это следует логически: точка не является std::pair, вы не хотите иметь публичное преобразование из точки в std::pair, но вы хотите использовать внутренние std:: pair.
другая возможность-это отношение has-a или композиция: каждая точка имеет-частную пару std::, которую она использует внутри.
на самом деле, нет большой разницы между составом и частное наследование, за исключением того, что в последнем вы можете принудительно привести к std::pair в функции-члене Point.
сверните свой собственный класс точек. Это позволит вам делать с ним в будущем любые вещи. В частности, я уже решал такого рода проблемы раньше, и то, что я нашел полезным, - это определить свою собственную структуру точек и создать класс точек, который наследует от нее.
полное раскрытие: мне не очень нравится STL.