Обращение к статическим функциям-членам из родительского класса [Решено]

Изображение пользователя Eugene.

Всем, здравствуйте!
Собственно вопрос скорее не технического, а эстетического характера.
Меня интересует практика хорошего тона обращения к статическим функциям-членам из класса в котором они определены.

В случае обращения из вне, все понятно. Объявляем имя класса со спецификатором принадлежности, а далее следует сам метод:
QApplication::aboutQt();

Однако, из класса в котором определен этот самый метод, к нему можно обратится несколькими способами:
1) aboutQt();
2) ::aboutQt();
3) QApplication::aboutQt();

Какой вариант по Вашему мнению наиболее предпочтителен?
Есть ли какие либо технические тонкости при различном обращении?

0
Eugene - 31 Август, 2013 - 22:33
Изображение пользователя Eugene.

Уже ответили на rsdn.ru
Посыпаю голову пеплом: http://www.rsdn.ru/?forum/cpp.applied/5279625
За глобальной, строгой архитектурой проекта, очень легко потерять бдительность и осторожность...

0
RA9OAJ - 2 Сентябрь, 2013 - 04:05
Изображение пользователя RA9OAJ.

Ну вообще логично, что обращаться надо по полному имени QApplication::aboutQt(), обращаться по имени статического метода можно только из объекта класса или объекта класса-потомка, там тогда априори this::aboutQt().

0
Eugene - 2 Сентябрь, 2013 - 06:05
Изображение пользователя Eugene.

Речь идет именно о вызове статических методов из методов класса к которому они и принадлежат...
А тут есть три варианта:
1) aboutQt();
2) ::aboutQt();
3) QApplication::aboutQt();

Однако, логически верным будет только последний.

0
mft - 2 Сентябрь, 2013 - 20:17

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(); - плохой вариант. Какой смысл указывать пространство имен, из того же пространства? Оно конечно работает, но больше писать и непонятно зачем.

0
mft - 2 Сентябрь, 2013 - 20:35

не совсем понятен вопрос...
Меня интересует практика хорошего тона обращения к статическим функциям-членам из класса в котором они определены.

А в заголовке Обращение к статическим функциям-членам из родительского класса

Иерархия классов есть или нет?

0
Eugene - 2 Сентябрь, 2013 - 22:52
Изображение пользователя Eugene.

На rsdn.ru, коллега, весьма прозрачно дал понять почему QApplication::aboutQt(), в общем случае, предпочтительней.
Если, при рефакторинге (добавлен еще один родительский класс), или изменен API одного из существующих... Как минимум, это вызовет ошибку времени компиляции.
API Qt, в стартовом топике, приведен в пример для наглядности (Я вовсе не собирался патчить Qt...)

И да, это:
Меня интересует практика хорошего тона обращения к статическим функциям-членам из класса в котором они определены.
и есть, как Вы и могли понять, суть вопроса...
А здесь:
Обращение к статическим функциям-членам из родительского класса
в угоду краткости заголовка, допущена ошибка. Увы.

P.S.
На самом деле, в текущем проекте, возможности C++ используются минимально. Полностью отсутствует множественное наследование и подобного рода вредные плюшки.
Поэтому вероятность ситуации, в которой мог ребром встать данный вопрос, стремится к нулю.
А это:
::aboutQt();
Согласен. Тупость. Бывает...

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры