Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
#1

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

25.05.2014, 23:19. Просмотров 479. Ответов 5
Метки нет (Все метки)

Здравствуйте!

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

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

Кто как поступает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2014, 23:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация мелких функций в hpp (C++):

Перегрузка функций. Реализация функций - C++
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

Реализация функций - C++
Помогите, пожалуйста, реализовать методы классов (заголовки даны в biTree.g) Я плохо шарю, а завтра сдавать! Очень надо( Дан: biTree.h...

Реализация функций интерфейса - C++
Есть класс с прототипами - интерфейс (верно?). Наследую от него два класса, А и В. Как мне в этих классах сделать разную реализацию...

Классы и реализация функций - C++
Дан класс Class Move { privare: double x; double y; public: //присваивает x, у значения a, b Move(double a=0, double...

Реализация перегруженных функций - C++
Нужна помощь по реализации перегруженных функций: int func (int * arr, int length, int number); int func (char * str, char ch); ...

Реализация математических функций - C++
Где можно найти, как реализованы примитивные мат. функции такие, как sqrt, pow, sin, asin, log и другие и сколько примерно тактов...

5
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
25.05.2014, 23:26 #2
Цитата Сообщение от relationer Посмотреть сообщение
Вопрос - стоит ли выносить их в отдельный cpp файл?
Цитата Сообщение от relationer Посмотреть сообщение
Есть шаблон класса Vector
шаблон в cpp?
Если да, то
Цитата Сообщение от relationer Посмотреть сообщение
Везде встречаю разные мнения
хватит по видео урокам учиться

Добавлено через 48 секунд
Цитата Сообщение от relationer Посмотреть сообщение
Повторюсь, что речь идет именно о мелких функция в одну строчку, типа:
где тут шаблон вектора?
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
25.05.2014, 23:26 #3
Выноси все, даже однострочные - будет меньше зависимостей
0
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
25.05.2014, 23:36  [ТС] #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-файл. И попробуйте найти там реализацию какой-нибудь действительно крутой и нужной функции.
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
26.05.2014, 01:10 #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.
Блин, накатал целое сочинению, но при отправлении произошла ошибка и все пропало Так что получай урезанную версию)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.05.2014, 01:25 #6
Цитата Сообщение от relationer Посмотреть сообщение
получится
Получится из этого undefined reference, потому что пытаетесь вынести шаблон в отдельную единицу трансляции, а код шаблона должен быть доступен при инстанцировании
0
26.05.2014, 01:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2014, 01:25
Привет! Вот еще темы с ответами:

Реализация функций из библиотеки math.h - C++
Нужно написать прогу реализующая 4 функции из библиотеки math.h с помощь классов!

Реализация метода штрафных функций - C++
Здравствуйте,нужна очень программа на С++ метода штрафных функции с использование метода Фибоначчи и градиентного метода по правилу...

Реализация схожих функций без копипаста - C++
Приветствую. Задача: имеется несколько схожих функций (одинаковые параметры, код отличается минимально - в одном месте) Функции...

Реализация класса функций принадлежности треугольника и трапеций - C++
Здравствуйте. Передо мной стоит такая задача. Необходимо реализовать задачу поиска регрессионной зависимости в условиях нечеткой логики....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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