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

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

10.01.2022, 17:31. Показов 2006. Ответов 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,208
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.01.2022, 10:11
Dolarun, в С++ объявление должно быть перед использованием.
1
0 / 0 / 0
Регистрация: 26.11.2021
Сообщений: 24
11.01.2022, 10:15  [ТС]
Спасибо, понял
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru