2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
1

Пространство имён

19.04.2015, 21:12. Показов 1108. Ответов 12
Метки нет (Все метки)

Добрый вечер,

1) как правильно называется часть "Foo::" в этой записи
C++
1
void Foo::hello(){}
2) и почему не сделают using namespace Foo; для класса если использовать за правило реализация методов одного класса в отдельном файле
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2015, 21:12
Ответы с готовыми решениями:

Пространство имен
Как составить код, когда необходимо использовать классы и методы из разных пространств имен. К...

пространство имен
Один практикующий программист сказал мне, что пространство именusing namespace std; нежелательно...

Пространство имен
Зачем пространство имен в программировании я чет не понимаю? У мну в учебнике отак написано....

Пространство имён!
Как лучше указывать пространство имён? using namespace std вначале? или std::? вроде бы проще...

12
Модератор
Эксперт С++
12639 / 10133 / 6102
Регистрация: 18.12.2011
Сообщений: 27,169
19.04.2015, 21:15 2
Это может быть как пространство имен, так и имя класса, в котором
есть статический метод hello()
0
rikimaru2013
19.04.2015, 21:19  [ТС]
  #3

Не по теме:

как вы определили что метод статический?)

0
Модератор
Эксперт С++
12639 / 10133 / 6102
Регистрация: 18.12.2011
Сообщений: 27,169
19.04.2015, 21:21 4
Нестатические методы нельзя вызывать без создания экземпляра класса,
т.к. они будут обращаться к несуществующим данным.
0
rikimaru2013
19.04.2015, 21:25  [ТС]
  #5

Не по теме:

где тут вызов? ((( zss, без обид - но я подожду людей, которые не знают, что это статических метод

0
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2015, 23:20 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) как правильно называется часть "Foo::" в этой записи
Приведённый вами пример может быть как реализации метода класса Foo, так и реализация функции из пространства имён Foo. Не знаю с чего вдруг zss решил, что она статическая, вполне может быть любой.
Слова далее были бы справедливы, если бы был вызов Foo::hello. Но его нет. Ничто же не мешает написать например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Foo
{
public:
    int hello();
};
 
void Foo::hello(){}
 
int main()
{
    Foo f;
    f.hello();
}
Добавлено через 1 минуту
С namespace это выглядело бы так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace Foo
{
    void hello();
};
 
// этот фрагмент не меняется
void Foo::hello(){}
 
// этот меняется, но только если в предыдущем не использовать статический метод hello
int main()
{
    Foo::hello();
}
1
Эксперт PHP
3102 / 2587 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
19.04.2015, 23:21 7
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
как правильно называется часть "Foo::" в этой записи
область видимости и не важно пространство имен это или имя класса.
1
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2015, 23:25 8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
2) и почему не сделают using namespace Foo; для класса если использовать за правило реализация методов одного класса в отдельном файле
Хотел бы уточнить, какой случай используется? То есть что в объявлении? Класс в namespace?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) как правильно называется часть "Foo::" в этой записи
Но это в любом случае область видимости. Область видимости пространства имён или область видимости класса.

Добавлено через 36 секунд
Ну в общем я опоздал с конкретизацией..
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.04.2015, 23:26  [ТС] 9
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
область видимости и не важно пространство имен это или имя класса.
Хоть кто-то ( Вопрос задали "в лоб" - и я понял, что он какой-то запутаный) думал переспросить)

Отсюда вопрос: почему using namespace не расширяет область видимости для реализации метода класса. Почему приходиться (если ваше утверждение правильное, что и то и то namespace) дописывать повсюду перед именем метода реализации
C++
1
Foo::
0
Эксперт PHP
3102 / 2587 / 1219
Регистрация: 14.05.2014
Сообщений: 7,231
Записей в блоге: 1
19.04.2015, 23:32 10
rikimaru2013, может потому что класс создает новый тип данных, члены которого инкапсулированы, и в дальнейшем его нельзя расширять в отличие от namespace? Честно сам задавался этим вопросом, но особо не углублялся.

Добавлено через 3 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
если ваше утверждение правильное, что и то и то namespace
Я этого не утверждал. Я лишь имел в виду, что в данном контексте это не важно, исходя из самого вопроса.
0
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2015, 23:35 11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Отсюда вопрос: почему using namespace не расширяет область видимости для реализации метода класса.
То, что Foo перед :: является областью видимости не делает класс namespace-ом. Да, он добавляет к своим методам ограничение на область видимости, но он больше, чем просто scope. Вобщем-то всё это лишь какие-то догадки. Сделали возможно просто чтобы не путать понятия.

Не по теме:

Я в начале вообще подумал что речь о том, что если класс в хедере объявлен в определённом namespace, то почему бы в файле с реализацией не написать в начале using namespace X;

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.04.2015, 23:38  [ТС] 12
Цитата Сообщение от MrGluck Посмотреть сообщение
Я в начале вообще подумал что речь о том, что если класс в хедере объявлен в определённом namespace, то почему бы в файле с реализацией не написать в начале using namespace X;
Ну я к этому и клонил. Что 21 век, с++14, почему бы не сделать как-то так:


C++
1
2
3
4
5
6
7
8
foo.h
namespace A
{
class Foo
{
void hello();
}
}
C++
1
2
3
4
5
6
7
8
foo.cpp
 
using namespace A::Foo;
 
void hello()
{
123
}
0
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2015, 23:54 13
rikimaru2013, Я про это:
C++
1
2
3
4
5
6
7
8
9
// foo.h
namespace A
{
    class Foo
    {
    public:
        static void hello();
    };
}
C++
1
2
3
4
// foo.cpp
using namespace A;
 
void Foo::hello(){}
вместо
C++
1
2
3
4
// foo.cpp
 
// и так дописываем А для каждого метода
void A::Foo::hello(){}
Добавлено через 20 секунд

Не по теме:

; после объявления класса не хватает



Добавлено через 3 минуты
Но вообщем-то можно и так ведь:
C++
1
2
3
4
5
6
7
8
9
10
11
// foo.h
namespace A
{
    class Foo
    {
    public:
        static void hello();
    };
}
 
using a = A::Foo;
C++
1
2
// foo.cpp
void a::hello(){}
C++
1
2
3
4
5
// main.cpp
int main()
{
    a::hello();
}
Добавлено через 48 секунд
P.S. я понимаю, что это прямиком не отвечает на поставленный вопрос. Скорее так - разговоры на тему.

Добавлено через 6 минут
На SO также считают, что класс это больше чем просто объявление своего scope. И точно также все свои ИМХО высказывают (как и мы тут).

Добавлено через 2 минуты
В стандарте ничего конкретного на эту тему не нашёл. Остаются догадки. Почему-то вспомнилось "миллионы мух не могут ошибаться"
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2015, 23:54
Помогаю со студенческими работами здесь

Пространство имён
Допустим я пишу свою программу, для которой пишу свои классы. Стоит ли создавать для них...

Пространство имен
Я часто встречаю в книгах, туторах, что объявлять пространство имен в больших проектах нельзя(не...

Пространство имён
Прочитал сейчас раздел про пространство имён, но так всё равно и не понял, почему лучше не...

пространство имён
Здравствуйте. Из C# я примерно представляю что такое пространство имён. Но возникает вопрос....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru