РЕШЕНО: Глупый вопрос про static функции (вдруг кто-то знает обходной путь)
Модератор: Модераторы разделов
РЕШЕНО: Глупый вопрос про static функции
Доброго времени суток!
Вопрос скорее теоретический, но в перспективе, возможно, буду использовать результат.
Итак, существует класс, в котором есть две публичные функции, причём одна из них static.
Как из static функции вызвать обычную, если параметры обычной функции трогать нельзя?
Пробовал с сигналами/слотами в Qt поиграться, но не получилось.
Понятно, что документация в явном виде запрещает такое, но вдруг кто знает обходной путь?
Не обязательно мультиплатформенно, но лучше для linux, конечно.
Вопрос скорее теоретический, но в перспективе, возможно, буду использовать результат.
Итак, существует класс, в котором есть две публичные функции, причём одна из них static.
Как из static функции вызвать обычную, если параметры обычной функции трогать нельзя?
Пробовал с сигналами/слотами в Qt поиграться, но не получилось.
Понятно, что документация в явном виде запрещает такое, но вдруг кто знает обходной путь?
Не обязательно мультиплатформенно, но лучше для linux, конечно.
Последний раз редактировалось devilr 03.08.2020 22:58, всего редактировалось 1 раз.
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Глупый вопрос про static функции
Как Вы себе это представляете?
Добавлено (01:06):
Нет, можно, конечно, передать static-методу указатель на объект (наподобие this) и вызвать его метод. Иначе — никак.Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Глупый вопрос про static функции
Если бы я представлял, я бы не спрашивал. Я же и написал, что вопрос глупый.
Но надежда пока не умерла...
Добавлено (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 функции
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Глупый вопрос про static функции
Сохраняйте указатель на класс в статическую переменную и используйте эту переменную в статической функции.
Re: Глупый вопрос про static функции
Как то так:
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;
}
Re: Глупый вопрос про static функции
Можно и так но это бессмысленно, так как при наличии экземпляра класса можно использовать его функции напрямую.
Re: Глупый вопрос про static функции
Хм, но 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;
}
Re: Глупый вопрос про static функции
Проблема в том, что я в static функцию не смогу передать ничего, т.к. там нельзя изменять количество входных параметров. Если бы можно было бы, я бы просто передал туда указатель на собственный класс и самого вопроса бы не было.
Пока думаю за event, но это скорее всего будет великим одноплатформенным костылём....
Re: Глупый вопрос про static функции
Хм, вроде есть наследование и переопределение, но тут трудно представить что у вас за проблема. Тут главное какова конечная цель, как то вы все равно решите.
Re: Глупый вопрос про static функции
Можно сделать класс `singleton` и тогда `static`-функция сможет создать экземпляр класса когда необходимо, можно сохранить указатель на класс в переменную доступную из `static`-функции.
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Глупый вопрос про static функции
devilr, выглядит так, что Вы пытаетесь изобрести кривой костыль вместо решения реальной проблемы. Если static-методу нужен объект класса, то он не должен быть static. Если же не-static методу не нужен объект, его можно сделать static. Если существующие методы не удовлетворяют Вашим потребностям, или их нельзя менять для сохранения API, добавьте новый.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Глупый вопрос про static функции
Кривой/прямой, всё равно ведь костыль Я просто попытался абстрагироваться от реальной задачи. Если её здесь описывать - проще ТЗ написать. Да и как то сомнительно, что здесь много программистов, использующих Qt. По крайней мере, решение Qt-проблем я здесь ранее не находил. Или есть Qt-программисты?Bizdelnick писал: ↑03.08.2020 12:08devilr, выглядит так, что Вы пытаетесь изобрести кривой костыль вместо решения реальной проблемы.
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Глупый вопрос про static функции
Кто ж их знает, пока не спросите — они не проявятся. NickLion здесь давно не появлялся, кто ещё в Qt шарит — не в курсе. А если вопрос очень глубоких познаний Qt не требует, то дока-то всем доступна.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Глупый вопрос про static функции
Ладно, попробуем.
Есть такая функция qInstallMessageHandler. Она устанавливает обработчик для перехвата вызовов всяких qInfo, qDebug и прочих. И пишет результат вызова в файл. Этот пример использования легко гуглится.
А хочется передать это в интерфейс, например в QTextEdit. Сам обработчик можно добавить в класс, только он будет static (обработчик, а не класс, конечно). А вот дальше как раз засада, у обработчика ровно 3 параметра и добавить ещё один уже не выйдет - он просто не вызовется.
Есть такая функция qInstallMessageHandler. Она устанавливает обработчик для перехвата вызовов всяких qInfo, qDebug и прочих. И пишет результат вызова в файл. Этот пример использования легко гуглится.
А хочется передать это в интерфейс, например в QTextEdit. Сам обработчик можно добавить в класс, только он будет static (обработчик, а не класс, конечно). А вот дальше как раз засада, у обработчика ровно 3 параметра и добавить ещё один уже не выйдет - он просто не вызовется.
Re: Глупый вопрос про static функции
Хм, я конечно понимаю что хочется, но вот что выдает assistant на эту функцию:
Код: Выделить всё
This function is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.
Re: Глупый вопрос про static функции
Вы путаете её с qInstallMsgHandler - она как раз ушла вместе с Qt4. А qInstallMessageHandler вполне бодро себя чувствует. В Qt5.
И я даже помню, что даже кто-то что-то делал похожее, но сейчас уже ту страницу не найду... если она вообще была
И я даже помню, что даже кто-то что-то делал похожее, но сейчас уже ту страницу не найду... если она вообще была
Re: Глупый вопрос про static функции
А ну да пересмотрел, да я ошибся. Тем не менее, попробовал пример из 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();
}
Re: Глупый вопрос про static функции
Не придумывайте. Зачем мне отдельный объект? Его ведь надо будет добавлять в тот же класс, где будет сам обработчик, И его надо будет добавлять, как static. В результате разваливаются уже остальные 99% программы. Я так уже пробовал.
Re: Глупый вопрос про static функции
Сами то пробовали так? Я не издеваюсь, если что.
Возможно, что вы уже догадались, что цель всего этого - логгер. И мой абстрактный "QLineEdit" - это просто пример. На деле в программе уже есть некий логгер, который просто имеет отрытые функции типа myInfo, myDebug и т.д. И дополнительные классы просто "подписываются" на них (т.е. имеют соответствующий сигнал, который и цепляется на одноимённый слот). А qDebug (как пример) сыпет в консоль. А хотелось бы его тоже увидеть в программе. И выносить доступ к всему этому ещё и наружу - идея так себе.
Re: Глупый вопрос про static функции
Зачем передавать его в класс если это глобальный обработчик? Инициализируйте при старте приложения или перед первым использованием в любом удобном месте.
Re: Глупый вопрос про static функции
А, вы вон как предлагаете! Я к чему то подобному сейчас подхожу. Там, возможно, будет проблема с утечкой памяти - ваши W1 и W2 то никто не контролирует... хотя это не точно.
Добавлено (20:13):
Это как раз было не обязательно. Я привёл просто как пример.
Re: Глупый вопрос про static функции
Это всего лишь указатели, и W1 не обязательно было создавать, его можно удалить. Утечки памяти быть не должно, так как нового объекта не создаётся, следовательно и переполнение не грозит, если только что то с кодом не намудрить. Если сильно хочется контроля то можно на данном примере создать сигнал и испускать его каждый раз из метода setEdit, сигнал и будет передавать текст в слот и т.д.
Спасибо сказали:
Re: Глупый вопрос про static функции
Я принцип понял, надо теперь просто его довести до ума (в соответствии с моими потребностями).
В любом случае, направление задано, спасибо!
В любом случае, направление задано, спасибо!
Re: Глупый вопрос про static функции
ormorph Только что проверил: в вашем случае деструктор объектов выполняется, так что всё нормально. Ура!
Re: РЕШЕНО: Глупый вопрос про static функции
От сюда вывод: Больные мозги лучше чем здоровые. Та как в данный момент температурю.
Хотя не надо сильно быть уверенным что Qt не С++, встречал я такие высказывания))
Re: РЕШЕНО: Глупый вопрос про static функции
Я такого не говорил. Ибо столько не выпью.
Выздоравливайте!