Форум программистов, компьютерный форум CyberForum.ru

Реализация мелких функций в hpp - C++

Восстановить пароль Регистрация
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
25.05.2014, 23:19     Реализация мелких функций в hpp #1
Здравствуйте!

Есть шаблон класса Vector с кучей мелких функций, типа сумма, разность, operator+, проч.
Вопрос - стоит ли выносить их в отдельный cpp файл? Везде встречаю разные мнения. Повторюсь, что речь идет именно о мелких функция в одну строчку, типа:
C++
1
static Vector2 reverse(const Vector2& vector) { return Vector2(-vector._x, -vector._y); }
Я выношу все крупные функции >1 строки отдельно.

Насколько я понимаю, также рекомендуется оставлять inline-функции в hpp.

Кто как поступает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2014, 23:19     Реализация мелких функций в hpp
Посмотрите здесь:

3 мелких вопроса C++
C++ Перегрузка функций. Реализация функций
C++ Реализация функций
Реализация математических функций C++
Реализация функций интерфейса C++
Реализация перегруженных функций C++
C++ Реализация класса функций принадлежности треугольника и трапеций
Классы и реализация функций C++
C++ Реализация функций из библиотеки math.h
C++ Реализация метода штрафных функций
C++ Создание стека С++ и реализация основных для него функций
C++ Нужна работающая реализация хеш-функций ГОСТ - Blake или Blake2

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12080 / 6941 / 782
Регистрация: 27.09.2012
Сообщений: 17,227
Записей в блоге: 2
Завершенные тесты: 1
25.05.2014, 23:26     Реализация мелких функций в hpp #2
Цитата Сообщение от relationer Посмотреть сообщение
Вопрос - стоит ли выносить их в отдельный cpp файл?
Цитата Сообщение от relationer Посмотреть сообщение
Есть шаблон класса Vector
шаблон в cpp?
Если да, то
Цитата Сообщение от relationer Посмотреть сообщение
Везде встречаю разные мнения
хватит по видео урокам учиться

Добавлено через 48 секунд
Цитата Сообщение от relationer Посмотреть сообщение
Повторюсь, что речь идет именно о мелких функция в одну строчку, типа:
где тут шаблон вектора?
Voivoid
 Аватар для Voivoid
585 / 261 / 12
Регистрация: 31.03.2013
Сообщений: 1,309
25.05.2014, 23:26     Реализация мелких функций в hpp #3
Выноси все, даже однострочные - будет меньше зависимостей
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
25.05.2014, 23:36  [ТС]     Реализация мелких функций в hpp #4
шаблон в cpp?
Нет, конечно.
Даю кривой, некорректный, недописанный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef MATH_VECTOR2_HPP
#define MATH_VECTOR2_HPP
 
#include <string>
 
#include "base_vector2.hpp"
 
namespace Math
{
    template<typename T>
    class Vector2 : public BaseVector2<T>
    {
    public:
        using BaseVector2<T>::BaseVector2;
 
        void setX(T x) { this->_x = x; }
        void setY(T y) { this->_y = y; }
 
        void add(Vector2 other) { this->_x += other._x; this->_y += other._y; }
        template<typename K>
        void mul(K number)      { this->_x *= number;   this->_y *= number; }
 
        static Vector2 add(const Vector2& first, const Vector2& second) { return Vector2(first._x + second._x, first._y + second._y); }
        static Vector2 reverse(const Vector2& vector)                   { return Vector2(-vector._x, -vector._y); }
 
        Vector2 operator+(const Vector2& other) { add(other); return *this; }
        template<typename K>
        Vector2 operator*(K other) { mul(other); }
        Vector2 operator-() { return Vector2(-this->_x, -this->_y); }
        Vector2 operator-(const Vector2& other) { return Vector2(this->_x - other._x, this->_y - other._y); }
 
        operator std::string() const { return "{" + std::to_string(this->_x) + ";" + std::to_string(this->_y) + "}"; }
        operator bool()        const { return this->_x && this->_y; }
    };
}
 
#endif
Вопрос - стоит ли все эти МЕЛКИЕ функции выносить в cpp? Заслуживает ли функция add такой чести?
Просто из
C++
1
void add(Vector2 other) { this->_x += other._x; this->_y += other._y; }
получится
C++
1
2
3
4
5
6
template<typename T>
void Math::Vector2<T>::add(const Vector2<T>& other)
{
    this->_x += other._x;
    this->_y += other._y;
}
Тупо получится очень объемный, но абсолютно неинтересный cpp-файл. И попробуйте найти там реализацию какой-нибудь действительно крутой и нужной функции.
monolit
180 / 180 / 21
Регистрация: 24.03.2011
Сообщений: 647
Завершенные тесты: 1
26.05.2014, 01:10     Реализация мелких функций в hpp #5
Цитата Сообщение от relationer Посмотреть сообщение
Просто из
Код C++
1
void add(Vector2 other) { this->_x += other._x; this->_y += other._y; }
получится
Код C++
Мне кажется, что лучшая читабельность второго по сравнению с первым вариантом очевидна. Лично я пишу реализацию функции в .h либо если она шаблонная, либо она является inline, и мне лень разбираться с порядком ее определения в cpp файле (т.е. вызовется ли она раньше определения или нет - поди разбери, чего там дальше в коде изменяться будет). Ну и короткой я называю нечто типа
C++
1
2
3
int size() {
   return mSize;
}
В общем, в .h стоит описывать то, чье определение в .cpp вызывает некоторые трудности (тот же пример с inline) - такова моя точка зрения. Не стоит .h засорять совершенно лишним. Хотя тут, как говорится, на вкус и цвет...

P.S.
То, что они у тебя влазят в одну строку, не означает, что они однострочные) Строк в половине из них у тебя как раз две, просто короткие) Ваш кэп.

Добавлено через 20 минут
Цитата Сообщение от relationer Посмотреть сообщение
Просто из
Код C++
1
void add(Vector2 other) { this->_x += other._x; this->_y += other._y; }
получится
Код C++
Мне кажется, второе более читабельный, чем первый)
Лично я размещаю в .h определение функций либо когда они шаблонные (выбора нет), либо когда inline, и выбор места их определения в .cpp иногда вызывает трудности (там же важен порядок объявления/применения, если не ошибаюсь) - конечно, если их в самом начале не размещать.

Цитата Сообщение от relationer Посмотреть сообщение
И попробуйте найти там реализацию какой-нибудь действительно крутой и нужной функции.
Может, открою для тебя америку, но в большинстве современных IDE есть мало того что скрытие блоков кода, так еще и переход от объявления к определению (F12 в студии). Ну и что ты тогда скажешь о крупных проектах, где несколько десятков тысяч строк в файле (утрирую немного, обычно стараются все-таки все по своим местам размещать, в нескольких файлах) - там наверняка не вручную всегда ищут нужное определение)

PS.
у тебя в половине случаев функции получаются однострочные лишь потому, что ты две 'логические' строки пишешь в одну - ну не красиво, право слово.

PS2.
Блин, накатал целое сочинению, но при отправлении произошла ошибка и все пропало Так что получай урезанную версию)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12080 / 6941 / 782
Регистрация: 27.09.2012
Сообщений: 17,227
Записей в блоге: 2
Завершенные тесты: 1
26.05.2014, 01:25     Реализация мелких функций в hpp #6
Цитата Сообщение от relationer Посмотреть сообщение
получится
Получится из этого undefined reference, потому что пытаетесь вынести шаблон в отдельную единицу трансляции, а код шаблона должен быть доступен при инстанцировании
Yandex
Объявления
26.05.2014, 01:25     Реализация мелких функций в hpp
Ответ Создать тему
Опции темы

Текущее время: 07:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru