РЕШЕНО: Глупый вопрос про static функции (вдруг кто-то знает обходной путь)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

РЕШЕНО: Глупый вопрос про static функции

Сообщение devilr »

Доброго времени суток!
Вопрос скорее теоретический, но в перспективе, возможно, буду использовать результат.
Итак, существует класс, в котором есть две публичные функции, причём одна из них static.
Как из static функции вызвать обычную, если параметры обычной функции трогать нельзя?
Пробовал с сигналами/слотами в Qt поиграться, но не получилось.
Понятно, что документация в явном виде запрещает такое, но вдруг кто знает обходной путь?
Не обязательно мультиплатформенно, но лучше для linux, конечно. :)
Последний раз редактировалось devilr 03.08.2020 22:58, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Глупый вопрос про static функции

Сообщение Bizdelnick »

Как Вы себе это представляете?
Добавлено (01:06):
Нет, можно, конечно, передать static-методу указатель на объект (наподобие this) и вызвать его метод. Иначе — никак.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

Bizdelnick писал:
03.08.2020 01:00
Как Вы себе это представляете?
Если бы я представлял, я бы не спрашивал. :) Я же и написал, что вопрос глупый.
Но надежда пока не умерла...
Добавлено (01:12):
Bizdelnick писал:
03.08.2020 01:00
Нет, можно, конечно, передать static-методу указатель на объект (наподобие this) и вызвать его метод. Иначе — никак.
Немного не так написал условия задачи - как раз параметры статик функции трогать нельзя.
Добавлено (01:13):
Хотя, может моя задача уже как-то и решена... я как то давно что-то подобное видел, вроде...
Добавлено (02:01):
Чисто теоретически, можно было бы писать в файл статичной функцией, а обычной читать из него. Мне скорости как бы не надо... но тут будет другая проблема, насколько я знаю, в linux хуков на открытие/чтение/запись, как в винде, вроде нет.... или есть?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Глупый вопрос про static функции

Сообщение Bizdelnick »

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
IMB
Сообщения: 2559
ОС: Debian

Re: Глупый вопрос про static функции

Сообщение IMB »

Сохраняйте указатель на класс в статическую переменную и используйте эту переменную в статической функции.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

Как то так:
Spoiler

Код: Выделить всё

#include <iostream>

class foo1 {
public:
	int bla(int ed) {
		return ed*2;
	}
	static int blabla( foo1 *f) {
		return f->bla(10);
	}
};

int main() {
	foo1 g;
	std::cout << g.blabla(&g) << std::endl;
}
Спасибо сказали:
IMB
Сообщения: 2559
ОС: Debian

Re: Глупый вопрос про static функции

Сообщение IMB »

Можно и так но это бессмысленно, так как при наличии экземпляра класса можно использовать его функции напрямую.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

IMB писал(а):
03.08.2020 09:35
Можно и так но это бессмысленно, так как при наличии экземпляра класса можно использовать его функции напрямую.
Хм, но static функции не являются членами класса, по этому нельзя на прямую обращаться к ним в классе, их указатели можно передавать в другие классы, либо структуры:
Spoiler

Код: Выделить всё

#include <iostream>

class foo1 {
public:
	int bla(int ed) {
		return ed*2;
	}
	static int blabla( foo1 *f) {
		return f->bla(10);
	}
};
typedef struct bas {
	int (*getg)(foo1 *f);
}bas;

int main() {
	foo1 g;
	bas f={.getg=g.blabla};
	std::cout << f.getg(&g) << std::endl;
}
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

ormorph писал(а):
03.08.2020 09:45
Хм, но static функции не являются членами класса, по этому нельзя на прямую обращаться к ним в классе, их указатели можно передавать в другие классы, либо структуры:
Проблема в том, что я в static функцию не смогу передать ничего, т.к. там нельзя изменять количество входных параметров. Если бы можно было бы, я бы просто передал туда указатель на собственный класс и самого вопроса бы не было. :)
Пока думаю за event, но это скорее всего будет великим одноплатформенным костылём....
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 11:23
Проблема в том, что я в static функцию не смогу передать ничего, т.к. там нельзя изменять количество входных параметров. Если бы можно было бы, я бы просто передал туда указатель на собственный класс и самого вопроса бы не было.
Хм, вроде есть наследование и переопределение, но тут трудно представить что у вас за проблема. Тут главное какова конечная цель, как то вы все равно решите.
Спасибо сказали:
IMB
Сообщения: 2559
ОС: Debian

Re: Глупый вопрос про static функции

Сообщение IMB »

Можно сделать класс `singleton` и тогда `static`-функция сможет создать экземпляр класса когда необходимо, можно сохранить указатель на класс в переменную доступную из `static`-функции.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Глупый вопрос про static функции

Сообщение Bizdelnick »

devilr, выглядит так, что Вы пытаетесь изобрести кривой костыль вместо решения реальной проблемы. Если static-методу нужен объект класса, то он не должен быть static. Если же не-static методу не нужен объект, его можно сделать static. Если существующие методы не удовлетворяют Вашим потребностям, или их нельзя менять для сохранения API, добавьте новый.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

Bizdelnick писал:
03.08.2020 12:08
devilr, выглядит так, что Вы пытаетесь изобрести кривой костыль вместо решения реальной проблемы.
Кривой/прямой, всё равно ведь костыль :) Я просто попытался абстрагироваться от реальной задачи. Если её здесь описывать - проще ТЗ написать. Да и как то сомнительно, что здесь много программистов, использующих Qt. По крайней мере, решение Qt-проблем я здесь ранее не находил. Или есть Qt-программисты?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Глупый вопрос про static функции

Сообщение Bizdelnick »

devilr писал(а):
03.08.2020 16:13
Да и как то сомнительно, что здесь много программистов, использующих Qt. По крайней мере, решение Qt-проблем я здесь ранее не находил. Или есть Qt-программисты?
Кто ж их знает, пока не спросите — они не проявятся. NickLion здесь давно не появлялся, кто ещё в Qt шарит — не в курсе. А если вопрос очень глубоких познаний Qt не требует, то дока-то всем доступна.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

Ладно, попробуем.
Есть такая функция qInstallMessageHandler. Она устанавливает обработчик для перехвата вызовов всяких qInfo, qDebug и прочих. И пишет результат вызова в файл. Этот пример использования легко гуглится.
А хочется передать это в интерфейс, например в QTextEdit. Сам обработчик можно добавить в класс, только он будет static (обработчик, а не класс, конечно). А вот дальше как раз засада, у обработчика ровно 3 параметра и добавить ещё один уже не выйдет - он просто не вызовется.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 16:32
Есть такая функция qInstallMessageHandler. Она устанавливает обработчик для перехвата вызовов всяких qInfo, qDebug и прочих.
Хм, я конечно понимаю что хочется, но вот что выдает assistant на эту функцию:

Код: Выделить всё

This function is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Т.е. эта функция устарела, и ее не рекомендуется использовать в новом коде, а значит должно быть альтернативное решение.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

Вы путаете её с qInstallMsgHandler - она как раз ушла вместе с Qt4. А qInstallMessageHandler вполне бодро себя чувствует. В Qt5.
И я даже помню, что даже кто-то что-то делал похожее, но сейчас уже ту страницу не найду... если она вообще была :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 18:01
Вы путаете её с qInstallMsgHandler - она как раз ушла вместе с Qt4. А qInstallMessageHandler вполне бодро себя чувствует.
А ну да пересмотрел, да я ошибся. Тем не менее, попробовал пример из assistant, немного подправил, и все получилось. Так что не вижу проблем.
Spoiler

Код: Выделить всё

#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
#include <QDebug>
#include <QtWidgets>

QLineEdit *A;
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    const char *file = context.file ? context.file : "";
    const char *function = context.function ? context.function : "";
    switch (type) {
    case QtDebugMsg:
        //fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        A->setText(localMsg.constData());
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    }
}

int main(int argc, char **argv)
{
    //qInstallMessageHandler(myMessageOutput);
    QApplication app(argc, argv);
    A = new QLineEdit;
    qInstallMessageHandler(myMessageOutput);
    A->show();
    qDebug() << "hello";
    return app.exec();
}
Просто создаётся глобальный указатель QLineEdit, а с ним уже работать как вздумается.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

ormorph писал(а):
03.08.2020 18:23
Просто создаётся глобальный указатель QLineEdit, а с ним уже работать как вздумается
Не придумывайте. Зачем мне отдельный объект? Его ведь надо будет добавлять в тот же класс, где будет сам обработчик, И его надо будет добавлять, как static. В результате разваливаются уже остальные 99% программы. Я так уже пробовал. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 18:33
Зачем мне отдельный объект?
Там всего лишь указатель, а на него можно навесить любой объект из любого класса, было бы желание, ссылку можно передать методом типа ссылка либо указатель. Так что обработчик не обязательно делать внутри класса.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

ormorph писал(а):
03.08.2020 18:43
Там всего лишь указатель, а на него можно навесить любой объект из любого класса, было бы желание, ссылку можно передать методом типа ссылка либо указатель.
Сами то пробовали так? Я не издеваюсь, если что.
Возможно, что вы уже догадались, что цель всего этого - логгер. И мой абстрактный "QLineEdit" - это просто пример. На деле в программе уже есть некий логгер, который просто имеет отрытые функции типа myInfo, myDebug и т.д. И дополнительные классы просто "подписываются" на них (т.е. имеют соответствующий сигнал, который и цепляется на одноимённый слот). А qDebug (как пример) сыпет в консоль. А хотелось бы его тоже увидеть в программе. И выносить доступ к всему этому ещё и наружу - идея так себе.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 18:57
Сами то пробовали так? Я не издеваюсь, если что.
Хм, я вообще не могу увидеть проблемы, вот попробовал, два окна в одном вводится текст и передаётся кнопкой в qDebug(), а обработчик уже выводит в другом окне ->проект
Спасибо сказали:
IMB
Сообщения: 2559
ОС: Debian

Re: Глупый вопрос про static функции

Сообщение IMB »

Зачем передавать его в класс если это глобальный обработчик? Инициализируйте при старте приложения или перед первым использованием в любом удобном месте.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

ormorph писал(а):
03.08.2020 20:01
Хм, я вообще не могу увидеть проблемы, вот попробовал, два окна в одном вводится текст и передаётся кнопкой в qDebug(), а обработчик уже выводит в другом окне ->проект
А, вы вон как предлагаете! :) Я к чему то подобному сейчас подхожу. Там, возможно, будет проблема с утечкой памяти - ваши W1 и W2 то никто не контролирует... хотя это не точно.
Добавлено (20:13):
IMB писал(а):
03.08.2020 20:09
Зачем передавать его в класс если это глобальный обработчик?
Это как раз было не обязательно. Я привёл просто как пример.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 20:12
Там, возможно, будет проблема с утечкой памяти - ваши W1 и W2 то никто не контролирует... хотя это не точно.
Это всего лишь указатели, и W1 не обязательно было создавать, его можно удалить. Утечки памяти быть не должно, так как нового объекта не создаётся, следовательно и переполнение не грозит, если только что то с кодом не намудрить. Если сильно хочется контроля то можно на данном примере создать сигнал и испускать его каждый раз из метода setEdit, сигнал и будет передавать текст в слот и т.д.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

Я принцип понял, надо теперь просто его довести до ума (в соответствии с моими потребностями).
В любом случае, направление задано, спасибо!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Глупый вопрос про static функции

Сообщение devilr »

ormorph Только что проверил: в вашем случае деструктор объектов выполняется, так что всё нормально. Ура! :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: РЕШЕНО: Глупый вопрос про static функции

Сообщение ormorph »

devilr писал(а):
03.08.2020 22:58
ormorph Только что проверил: в вашем случае деструктор объектов выполняется, так что всё нормально. Ура!
От сюда вывод: Больные мозги лучше чем здоровые. Та как в данный момент температурю.
Хотя не надо сильно быть уверенным что Qt не С++, встречал я такие высказывания))
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: РЕШЕНО: Глупый вопрос про static функции

Сообщение devilr »

ormorph писал(а):
03.08.2020 23:46
Хотя не надо сильно быть уверенным что Qt не С++, встречал я такие высказывания))
Я такого не говорил. Ибо столько не выпью. :D
Выздоравливайте!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Ответить