Создание класса Point в C ++ - PullRequest
6 голосов
/ 01 мая 2009

Прямо сейчас я использую std :: pair для представления 2d-точки в c ++. Однако меня раздражает необходимость писать

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

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

вместо возможности перегрузки оператора + и оператора -.

Итак, мой вопрос в том, чтобы сделать мой класс Point, я должен

  • Публично наследовать от std :: pair и добавлять свои собственные функции-члены? Это хорошо, потому что весь мой код может остаться прежним. Я не собираюсь делать что-то вроде std::pair<double, double>* p = new Point;, поэтому мне не нужно беспокоиться о таких вещах, как виртуальные деструкторы.
  • Сверните мой собственный класс Point, что раздражает, так как я дублирую функциональность std :: pair, однако я «делаю это чисто».
  • Создайте шаблонную специализацию оператора + и оператора- для std :: pair, что, правда, я не помню, чтобы они входили в исходные файлы или заголовочные файлы.

Полагаю, это для обсуждения, я бы очень хотел сделать №1, но я не знаю, плохая ли это идея, поскольку я слышал, что наследование от STL - нет-нет.

Ответы [ 8 ]

14 голосов
/ 01 мая 2009

Вы можете свернуть свой собственный класс Point, но использовать std :: pair для хранения данных. Это предотвращает наследование от проблемы STL, но все еще использует функциональность std :: pair.

2 голосов
/ 01 мая 2009

Я бы за создание своего собственного класса Point и использование частного наследования или композиции, если вы хотите использовать функциональность std :: pair. Проблема с typedef (как я уверен, вы знаете) состоит в том, что любая написанная вами функция, которая принимает Point, будет также использоваться чем-либо, представленным как std :: pair , что может быть недопустимым.

Имея это в виду, существует еще один вариант - просто создать несколько бесплатных функций, таких как

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

(имена функций могут быть лучше).

2 голосов
/ 01 мая 2009

Лучше, чем кататься самостоятельно: возьмите существующую бесплатную библиотеку Vector / Point. Одна рекомендация: тот, который прикреплен к Essential Math для программистов игр . Вы можете использовать любую библиотеку, которую найдете в качестве отправной точки, а затем оптимизировать / специализировать / настроить оттуда.

1 голос
/ 01 мая 2009

Частное наследство, иначе наследование реализации, ваш друг.

Это логически вытекает: Point НЕ является std :: pair, вы не хотите публичного преобразования с повышением приведения из Point в std :: pair, но вы хотите использовать внутренние компоненты std :: pair.

Другая возможность связана с отношением has-a или композицией: у каждого Point есть - privbate std :: pair, который он использует внутри.

Фактически, нет большой разницы между составом и частным наследованием, за исключением того, что в последнем вы можете принудительно привести к приведению к std :: pair в функции-члене Point.

1 голос
/ 01 мая 2009

Я думаю, что "Best Practices" сказали бы, чтобы вы бросили свой собственный класс Point. Таким образом, вы можете сделать 3D намного проще в будущем.

1 голос
/ 01 мая 2009

Еще одним вариантом может быть создание собственного класса Point и предоставление вашему классу «собственного» std :: pair, представляющего координаты точки.

Во многих случаях отношение "HAS A" (композиция) предпочтительнее, чем отношение "IS A" (наследование).

0 голосов
/ 24 января 2012

Не наследуйте публично от std :: pair, потому что std :: pair имеет оператор <, но ваша точка не должна иметь. </p>

0 голосов
/ 01 мая 2009

Бросьте свой собственный класс Point. Это позволит вам в будущем делать с ним любое количество вещей. В частности, я уже решал подобные проблемы раньше, и мне показалось полезным определить мою собственную структуру Point и создать класс Point, который наследует ее.

Полное раскрытие: мне не очень нравится STL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...