Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.11.2021
Сообщений: 24

Дурно ли пахнет данная практика?

10.01.2022, 17:31. Показов 2033. Ответов 9

Студворк — интернет-сервис помощи студентам
Добрый время суток уважаемые програмисты, можно ли так делать, а именно глобально объявлять namespace в файле, где определяются методы и функции-помощники класса? Плохая ли это практика? Пример->
hpp-
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
namespace Chrono
{
    class Date
    {
    public:
        Date(int d, int m, int y) : d(d), m(m), y(y)
        {
        }
        void set_default();
        Date &add_year(int n);
        //Date &add_month(int n);
        //Date &add_day(int n);
    private:
        int d, m, y;
    };
    bool leapyear(int n);
}
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
#include "header.hpp"
using namespace Chrono;
 
Date& Date::add_year(int n)
{
    if (d == 29 && m == 2 && leapyear(y + n))
    {
        d = 1;
        m = 3;
    }
    y += n;
    return *this;
}
void Date::set_default(){
            d = 1;
            m = 1;
            y = 1970;
        }
 
bool leapyear(int n)
{
    return n % 4 == 0 ? true : false;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2022, 17:31
Ответы с готовыми решениями:

Набираеться dev team - практика практика практика php 5.3
Требуется 3 человека для совместной разработки проекта. Требования: знание html, основ php, комуникабельность и стремление, GIT или...

ТВ и компьютерные игры дурно влияют на взаимоотношения подростков с родителями
Тинейджеры, проводящие много времени перед телевизором или за компьютерными играми, зачастую состоят в плохих отношениях с родителями. А...

пахнет горелым
Добрый день. Ноутбук пахнет плавленым пластиком или резиной (довольно специфический запах), но не сильно в простое. Под тестом или игрой...

9
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
10.01.2022, 18:59
Лучший ответ Сообщение было отмечено Dolarun как решение

Решение

На прошлой работе такой using namespace был обязательным.
Хорошо это или плохо - не знаю, но иногда бывали проблемы.

Добавлено через 7 минут
Пример возможной проблемы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace ns
{
    struct Some {};
    
    bool operator==(const Some&, const Some&);
}
 
int main(){
    ns::Some s1;
    ns::Some s2;
    s1 == s2;
}
 
using namespace ns;
 
//Это не ns::operator==(const Some&, const Some&),
//т.е. здесь придется либо включать внутрь ns, 
//либо добавлять явную квалификацию ns::operator==
bool operator==(const Some&, const Some&)
{
    return true;
}
Ну и плюс всякие ambiguous могут быть, или другие "сюрпризы", но это, думаю, Вы и так понимаете.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
10.01.2022, 19:35
Лучший ответ Сообщение было отмечено Dolarun как решение

Решение

Цитата Сообщение от Dolarun Посмотреть сообщение
Добрый время суток уважаемые програмисты, можно ли так делать, а именно глобально объявлять namespace в файле, где определяются методы и функции-помощники класса? Плохая ли это практика?
В файле реализации вы можете делать что угодно, если вам так удобнее. Но имейте в виду, что ваше using namespace Chrono влияет только на name lookup в определениях вида

C++
1
2
3
4
Date& Date::add_year(int n)
{
  ...
}
то есть благодаря ему вам не нужно писать Chrono::Date& Chrono::Date::add_year(int n). Другими словами, "срабатывать" ваше using namespace Chrono только в тех случаях, когда компилятор "вынужден" искать ранее определенные имена.

Но как только компилятор имеет возможность предположить, что это объявление нового имени, а не ссылка на ранее объявленное, ваше using namespace Chrono уже влиять ни на что не будет. Вот здесь уже произойдет то, о чем предупреждает Croessmah выше

C++
1
2
3
4
bool leapyear(int n)
{
    return n % 4 == 0 ? true : false;
}
Здесь вы получаете определение функции ::leapyear для глобального пространства имен, а не вашей Chrono::leapyear.

По таким причинам, наверное, лучше все таки делать

C++
1
2
3
4
namespace Chrono
{
  ...
}
и в файле реализации тоже.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.01.2022, 21:13
Лучший ответ Сообщение было отмечено Dolarun как решение

Решение

Цитата Сообщение от Dolarun Посмотреть сообщение
глобально объявлять namespace в файле
это - не глобальное объявление.
область видимости файла так и называется: "областью видимости файла"

Цитата Сообщение от Dolarun Посмотреть сообщение
Плохая ли это практика?
нет, не плохая.

детали реализации пиши как хочешь.
как тебе удобнее, и больше нравится.
1
0 / 0 / 0
Регистрация: 26.11.2021
Сообщений: 24
10.01.2022, 23:44  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
это - не глобальное объявление.
область видимости файла так и называется: "областью видимости файла"
Получается у namespace, как говорится, внутреннее связывание, то есть он виден только в той единице трянсляции, в которой определён? Я правильно понимаю?

Добавлено через 7 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Здесь вы получаете определение функции ::leapyear для глобального пространства имен, а не вашей Chrono::leapyear.
По таким причинам, наверное, лучше все таки делать
C++Выделить код
1
2
3
4
namespace Chrono
{
  ...
}
и в файле реализации тоже.
Замечательно, одним выстрелом двух зайцев:
1)Не нужно писать квалификаторы.
2)Функция не находится в глобальном пространстве имён.


Добавлено через 43 минуты
Не хочется создавать новую тему, так как код будет тот же. Но вот ещё вопрос.
Функция
C++
1
 bool leapyear(int n)
- есть часть реализации класса Date, но так ей не нужен доступ к this и приватным членам класса, я решил определить его вне класса Date. Мне нужно сделать, чтобы она была видна для member-функции
C++
1
Date &Date::add_year(int n)
и всё. То есть, чтобы она была видна только для файла реализации, так как пользователю очевидно она не нужна.

Я пробовал обворачивать
C++
1
 bool leapyear(int n)
в анонимной пространство времён, но в этом случае её не видел метод
C++
1
Date &Date::add_year(int n)
.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.01.2022, 09:05
Цитата Сообщение от Dolarun Посмотреть сообщение
внутреннее связывание
Связывание и область видимости - это разные вещи.

Добавлено через 3 минуты
Цитата Сообщение от Dolarun Посмотреть сообщение
Мне нужно сделать, чтобы она была видна для member-функции add_year и всё.
Сделайте ее лямбда-функцией прямо внутри add_year.

Цитата Сообщение от Dolarun Посмотреть сообщение
Я пробовал обворачивать
Как и где именно?
1
0 / 0 / 0
Регистрация: 26.11.2021
Сообщений: 24
11.01.2022, 10:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Как и где именно?
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
#include "header.hpp"
namespace Chrono
{
 
    Date &Date::add_year(int n)
    {
        if (d == 29 && m == 2 && leapyear(y + n))
        {
            d = 1;
            m = 3;
        }
        y += n;
        return *this;
    }
    void Date::set_default()
    {
        d = 1;
        m = 1;
        y = 1970;
    }
}
namespace
{
    bool leapyear(int n)
    {
        return n % 4 == 0 ? true : false;
    }
}
А из header объявление удалил.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.01.2022, 10:11
Dolarun, в С++ объявление должно быть перед использованием.
1
0 / 0 / 0
Регистрация: 26.11.2021
Сообщений: 24
11.01.2022, 10:15  [ТС]
Спасибо, понял
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.01.2022, 10:17
Dolarun,
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
#include "header.hpp"
 
namespace
{
    bool leapyear(int n)
    {
        return n % 4 == 0 ? true : false;
    }
}
 
namespace Chrono
{
 
    Date &Date::add_year(int n)
    {
        if (d == 29 && m == 2 && leapyear(y + n))
        {
            d = 1;
            m = 3;
        }
        y += n;
        return *this;
    }
    void Date::set_default()
    {
        d = 1;
        m = 1;
        y = 1970;
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2022, 10:17
Помогаю со студенческими работами здесь

БП пахнет горелым
Имеется БП корсар CX750M. Некоторое время назад при некоторых обстоятельствах комп отрубился и не включался. Спустя некоторое время комп...

Компьютер пахнет гарью
Всем добрый день. Столкнулся вот с такой проблемой. Cобрали компьютер две недели назад. Проц. A4-4020 Мать MSIA68HM Память...

Компьютер пахнет горелым
Добрый день! Есть такая проблема: в последнее время начал замечать, что о компьютера похнет горелым, сборка не слабая: Rtx 2060 HyperX...

БП работает, но пахнет паленым
Компу полтора года, проц i5 4670, м.п. asrock b85, БП corsair cx750. Позавчера почувствовал запах паленого из компьютера. На следующий...

Из системного блока пахнет горелым
У родителей в частном секторе (скачет напряжение) компьютер подключен к ИБП и к стабилизатору. Жалуются уже второй раз на неприятный запах....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru