Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474

О экземплярах класса

14.12.2018, 21:43. Показов 2249. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.

Есть класс Websocket .h/.cpp

В websocket.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "websocket.h"
 
//--------------------------------------------------------------------------------------------------------------------
Websocket::Websocket(quint16 Port, QObject *parent) : QObject(parent),
    PWebSocketServer(new QWebSocketServer(QStringLiteral("FRS Web Server"), QWebSocketServer::NonSecureMode, this))
{
    if (PWebSocketServer->listen(QHostAddress::Any, Port))
    {
        qWarning() << "Chat Server listening on port " << Port;
        connect(PWebSocketServer, &QWebSocketServer::newConnection,
                this, &Websocket::OnNewConnection);
    }
}
И соответственно .h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef WEBSOCKET_H
#define WEBSOCKET_H
 
#include <QObject>
#include <QWidget>
#include <QtWebSockets/QtWebSockets>
#include <QtWebSockets>
#include <QtCore>
#include <cstdio>
#include <QtCore/QList>
 
//--------------------------------------------------------------------------------------------------------------------
 
class Websocket : public QObject
{
    Q_OBJECT
public:
 
    explicit Websocket(quint16 Port, QObject *parent = nullptr);
    virtual ~Websocket();
 
private slots:
  void OnNewConnection();
 
signals:
 
public slots:
 
private:
    QWebSocketServer *PWebSocketServer;
 
};
 
#endif // WEBSOCKET_H
То есть, если я в каком-либо ином классе напишу (пусть класс Б)

C++ (Qt)
1
 Websocket *WS = new Websocket(1234);
То создам экземпляр класса Websocket и начну слушать указанный порт.

Теперь вопрос: а что если мне надо использовать это подключение в более чем в одном классе (Не только в классе Б)? Как его использовать без попытки открыть уже открытый порт в классе В?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2018, 21:43
Ответы с готовыми решениями:

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса. Буду очень...

Вызов слота класса потомка при вызове сигнала класса родителя
Всем привет. Ситуация следующая. Есть класс родитель &quot;class1&quot;. В нём объявлен и вызывается сигнал &quot;signal&quot;. Есть класс...

Ошибка при обращении из одного класса к методу другого класса
Структура проекта, 2 класса: класс графики MainWindow класс логики Сannibals при обращении из mainwindow к методу из cannibals...

5
 Аватар для mvngr
225 / 189 / 98
Регистрация: 15.04.2018
Сообщений: 718
14.12.2018, 23:16
Возможно, существует более профильное решение, которое будет касаться именно сокетов.

Но вообще ваша задумка подпадает под singleton (у самого всё никак руки не доходят до паттернов программирования, стыдно )
1
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
14.12.2018, 23:30  [ТС]
Цитата Сообщение от mvngr Посмотреть сообщение
Но вообще ваша задумка подпадает под singleton
Вкуриваю...
Сначала думал о static, но идея так себе.
Проблема моя в том, что если у меня n классов в приложении и в каждом мне надо использовать этот сокет, то я получу кучу (n-1) никак не связанных между собой экземпляров класса из которых подкючен собственно будет только один (способен слушать порт, отправлять/получать сообщения/данные) а все остальные не будут работать после попытки начать слушать уже занятый порт.
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
03.01.2019, 09:58  [ТС]
Согласно полученной информации, за что конечно спасибо, смог сделать вот так:
Соответственно класс с Веб-Сокетом.
.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#ifndef WEBSOCKET_H
#define WEBSOCKET_H
 
#include <QObject>
#include <QWidget>
#include <QtWebSockets/QtWebSockets>
#include <QtWebSockets>
#include <QtCore>
#include <cstdio>
#include <QtCore/QList>
#include <QMutex>
 
//--------------------------------------------------------------------------------------------------------------------
class Websocket;
class WebsocketDestroyer
{
private:
    Websocket* p_InstanceWS;
public:
    ~WebsocketDestroyer();
     void initialize( Websocket* p);
};
 
//--------------------------------------------------------------------------------------------------------------------
 
class Websocket : public QObject
{
    Q_OBJECT
public:
    explicit Websocket(quint16 Port, QObject *parent = nullptr);
    static Websocket& getInstance(int Port);
 
private:
    QWebSocketServer *PWebSocketServer;
    static Websocket* p_InstanceWS;
    static WebsocketDestroyer DestroyerWS;
 
    QList<QWebSocket *> ClientsList;
    bool m_debug;
 
private slots:
    void OnNewConnection();
    void SocketDisconnected();
 
protected:
    Websocket() { }
    Websocket( const Websocket& );
    Websocket& operator=( Websocket& );
   ~Websocket() { }
    friend class WebsocketDestroyer;
 
signals:
    void closed();
 
public slots:
    void ProcessTextMessage(QString message);
    void ProcessBinaryMessage(QByteArray message);
 
};
 
#endif // WEBSOCKET_H
//--------------------------------------------------------------------------------------------------------------------
.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "websocket.h"
 
 
Websocket *Websocket::p_InstanceWS = 0;
WebsocketDestroyer Websocket::DestroyerWS;
 
//--------------------------------------------------------------------------------------------------------------------
Websocket::Websocket(quint16 Port, QObject *parent) : QObject(parent),
    PWebSocketServer(new QWebSocketServer(QStringLiteral("FRS Web Server"), QWebSocketServer::NonSecureMode, this))
{
    if (PWebSocketServer->listen(QHostAddress::Any, Port))
    {
        qWarning() << "Chat Server listening on port " << Port;
        connect(PWebSocketServer, &QWebSocketServer::newConnection, this, &Websocket::OnNewConnection);
    }
    else
    {
        qWarning() << "Something is wrong";
    }
}
 
//--------------------------------------------------------------------------------------------------------------------
 
void Websocket::OnNewConnection()
{
  // /*
    QWebSocket *PSocket = PWebSocketServer->nextPendingConnection();
    connect(PSocket, &QWebSocket::textMessageReceived, this, &Websocket::ProcessTextMessage);
    connect(PSocket, &QWebSocket::binaryMessageReceived, this, &Websocket::ProcessBinaryMessage);
    connect(PSocket, &QWebSocket::disconnected, this, &Websocket::SocketDisconnected);
  //  */
}
//--------------------------------------------------------------------------------------------------------------------
WebsocketDestroyer::~WebsocketDestroyer()
{
    delete p_InstanceWS;
}
//--------------------------------------------------------------------------------------------------------------------
void WebsocketDestroyer::initialize(Websocket *p)
{
    p_InstanceWS = p;
}
//--------------------------------------------------------------------------------------------------------------------
 
Websocket& Websocket::getInstance(int Port)
{
    if(!p_InstanceWS)
    {
        p_InstanceWS = new Websocket(Port);
        DestroyerWS.initialize(p_InstanceWS);
    }
    return *p_InstanceWS;
}
//--------------------------------------------------------------------------------------------------------------------
 
void Websocket::ProcessTextMessage(QString message)
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    if (m_debug)
        qDebug() << "Message received:" << message;
    if (pClient) {
        pClient->sendTextMessage(message);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
void Websocket::ProcessBinaryMessage(QByteArray message)
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    if (m_debug)
        qDebug() << "Binary Message received:" << message;
    if (pClient) {
        pClient->sendBinaryMessage(message);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
void Websocket::SocketDisconnected()
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    if (m_debug)
        qDebug() << "socketDisconnected:" << pClient;
    if (pClient) {
        ClientsList.removeAll(pClient);
        pClient->deleteLater();
    }
}
//--------------------------------------------------------------------------------------------------------------------
Как видно, внутри класса есть функция отправки сообщения (пусть строки)
Эту функцию не могу сделать статической, так как sender() статическим не является.
Как эту функцию вызвать из иного класса, для отправки сообщения?
Я хотел было сделать просто, так же как и со статическими методами
C++ (Qt)
1
Websocket::ProcessTextMessage("Something");
Но так не взлетает, в отличии от
C++ (Qt)
1
Websocket::getInstance(1234);
Функции которая статической является
Прошу совета как разрешить проблему.
Метод Websocket::getInstance(1234); Вызываю из одного класса,
А отправку сообщения Websocket::ProcessTextMessage("Something ");
Нужно сделать из другого, не создавая отдельного экземпляра вроде Websocket *PWebSock = new Websocket();
0
20 / 16 / 5
Регистрация: 07.01.2019
Сообщений: 90
07.01.2019, 13:49
Цитата Сообщение от newline Посмотреть сообщение
Теперь вопрос: а что если мне надо использовать это подключение в более чем в одном классе (Не только в классе Б)? Как его использовать без попытки открыть уже открытый порт в классе В?
Хорошим решением может стать создание прослойки. Инициализируете websocket в прослойке и используете его везде где нужно. Сам сталкивался с такой проблемой когда писал чатик)
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
08.01.2019, 23:30  [ТС]
Данную проблему решил так:
C++ (Qt)
1
2
3
4
5
void Websocket::SendTxtMessage(QString message)
{
    if (messageSocket)
        messageSocket->sendTextMessage(message);
}
Сообщение теперь отправляется без проблем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2019, 23:30
Помогаю со студенческими работами здесь

Вызов функции из одного класса кнопкой из другого класса
Доброго времени суток. Помогите разобраться с сигналами и слотами. Уже устал перечитывать не могу до конца понять один момент. У меня...

QSet указателей на объекты класса, сортированный по полю класса
Здравствуйте. Возьмём тестовый класс: class TEST { public: TEST(); QString name; } Допустим у меня есть...

Экземпляры класса. Обращение к методам и переменным класса
Добрый день. В одном из классов создан список JSON записей QJSONArray А так же вектор из целых чисел. Вот фрагмент заголовочного...

Взаимодействие с виджетами класса QMainWindow из класса QOpenGLWidget
Здравствуйте, недавно начал изучать Qt, столкнулся с проблемой. Мне необходимо получить доступ к различным виджетам главного окна из...

Разное значение переменной класса, в разных экземплярах класса
Вот примерный код: class Test { private: static int countC; static int countD; void initWeight(){ double a; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru