Всем, здравствуйте!
Собственно вопрос скорее не технического, а эстетического характера.
Меня интересует практика хорошего тона обращения к статическим функциям-членам из класса в котором они определены.
В случае обращения из вне, все понятно. Объявляем имя класса со спецификатором принадлежности, а далее следует сам метод:
QApplication::aboutQt();
Однако, из класса в котором определен этот самый метод, к нему можно обратится несколькими способами:
1) aboutQt();
2) ::aboutQt();
3) QApplication::aboutQt();
Какой вариант по Вашему мнению наиболее предпочтителен?
Есть ли какие либо технические тонкости при различном обращении?
Уже ответили на rsdn.ru
Посыпаю голову пеплом: http://www.rsdn.ru/?forum/cpp.applied/5279625
За глобальной, строгой архитектурой проекта, очень легко потерять бдительность и осторожность...
Ну вообще логично, что обращаться надо по полному имени QApplication::aboutQt(), обращаться по имени статического метода можно только из объекта класса или объекта класса-потомка, там тогда априори this::aboutQt().
Речь идет именно о вызове статических методов из методов класса к которому они и принадлежат...
А тут есть три варианта:
1) aboutQt();
2) ::aboutQt();
3) QApplication::aboutQt();
Однако, логически верным будет только последний.
class QApplication
{
public:
static void aboutQt()
{
std::cout << __FUNCTION__ << std::endl;
}
static void foo()
{
std::cout << std::endl << __FUNCTION__ << "\n-------------------\n";
aboutQt();
::aboutQt();
QApplication::aboutQt();
}
};
aboutQt(); - хороший вариант.
::aboutQt(); - бред, в глобальном пространстве имен нет такого метода.
QApplication::aboutQt(); - плохой вариант. Какой смысл указывать пространство имен, из того же пространства? Оно конечно работает, но больше писать и непонятно зачем.
не совсем понятен вопрос...
А в заголовке
Иерархия классов есть или нет?
На rsdn.ru, коллега, весьма прозрачно дал понять почему QApplication::aboutQt(), в общем случае, предпочтительней.
Если, при рефакторинге (добавлен еще один родительский класс), или изменен API одного из существующих... Как минимум, это вызовет ошибку времени компиляции.
API Qt, в стартовом топике, приведен в пример для наглядности (Я вовсе не собирался патчить Qt...)
И да, это:
и есть, как Вы и могли понять, суть вопроса...
А здесь:
в угоду краткости заголовка, допущена ошибка. Увы.
P.S.
На самом деле, в текущем проекте, возможности C++ используются минимально. Полностью отсутствует множественное наследование и подобного рода вредные плюшки.
Поэтому вероятность ситуации, в которой мог ребром встать данный вопрос, стремится к нулю.
А это:
::aboutQt();
Согласен. Тупость. Бывает...
Отправить комментарий