Форма и классы на С++

Программирование, которое не связано с API.
Ответить
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Форма и классы на С++

Сообщение Casperovskii »

Так как раздел PHP и другие языки, то я оставлю это здесь.
У меня возникла проблема, есть фаил main.cpp:

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

#include <QtGui/QApplication>#include "mainwindow.h"#include "multiserver.h" int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    multiServer myServer;     w.show();        return a.exec();}
Мне нужно из объекта myServer (класс multiServer) обратится к объекту w (класс MainWindow). И из других объектов (дочерних к myServer) тоже обращаться к этому же w - форме. Т.е. мне нужна 1(одна)-единственная форма для всех объектов и возможность обращаться к ней из разных объектов и из неё к разным объектам. Это реально?
Пока выход из положения я вижу один - запихнуть объект w в myServer со всеми вытекающими. Есть ли другие варианты?
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Форма и классы на С++

Сообщение Alazaur »

Casperovskii, ну да в классе multiServer сделать указатель на объект.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Форма и классы на С++

Сообщение Casperovskii »

Alazaur
Мне необходимо и обратное взаимодействие... Чтобы из формы можно было обратится к mulriServer.
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Форма и классы на С++

Сообщение Alazaur »

ну сделать перекрестные указатели. правда есть вероятность при удалении одного из объектов, в другом указатель будет ссылаться на неопределенное место в памяти. Безопаснее наверно будет сделать класс-хелпер со статическими переменными и работать через него.
Ну это то что в голову приходит, а вообще скорее всего есть решение изящнее, х.з. у меня знания C++ теоретические в рамках институтской программы. )))
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Форма и классы на С++

Сообщение Casperovskii »

Alazaur
Можно пример с заголовочными файлами и самими классами? Потому что я намучался уже, не могу никак понять, что не так. Эти объекты точно не будут удаляться. У меня уже руки опускаются. 3 дня сижу на одном месте из-за такой фигни.
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Форма и классы на С++

Сообщение Alazaur »

Ну как-то так
multiserver.h

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

#ifndef MULTI_SERVER_H#define MULTI_SERVER_H#include "mainwindow.h" class MainWindow;class MultiServer {    protected:        MainWindow * window;    public:        MultiServer();        MultiServer(MainWindow &win);        void setPtrWindow(MainWindow &win);        void setWindow(MainWindow win);        MainWindow getWindow();};#endif
multiserver.cpp

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

#include "multiserver.h" MultiServer::MultiServer(){}MultiServer::MultiServer(MainWindow &win):window(&win){}void MultiServer::setPtrWindow(MainWindow &win){window = &win;}void MultiServer::setWindow(MainWindow win){*window = win;}MainWindow MultiServer::getWindow(){return *window;}
mainwindow.h

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

#ifndef MAIN_WINDOW_H#define MAIN_WINDOW_H#include "multiserver.h" class MultiServer;class MainWindow {    protected:        MultiServer * server;    public:        MainWindow();        MainWindow(MultiServer &serv);        void setPtrServer(MultiServer &serv);        void setServer(MultiServer serv);        MultiServer getServer();};#endif
mainwindow.cpp

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

#include "mainwindow.h" MainWindow::MainWindow(){}MainWindow::MainWindow(MultiServer &serv):server(&serv){}void MainWindow::setPtrServer(MultiServer &serv){server = &serv;}void MainWindow::setServer(MultiServer serv){*server = serv;}MultiServer MainWindow::getServer(){return *server;}
Ну и майн:

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

#include "multiserver.h"#include "mainwindow.h" int main(int argc, char *argv[]){    MainWindow window;    MultiServer server;    server.setPtrWindow(window);    window.setPtrServer(server);}
Если смущает что в заголовочных файлах перекрестное объявление классов можно или создать третий общий для них или сунуть оба класса в один заголовок.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Форма и классы на С++

Сообщение Casperovskii »

Alazaur
Практически осилил, но возникли некоторые проблемы... И да, я пишу код в Qt, поэтому прошу помощи через скайп, который выслал в личку. Я думаю, это не отнимет много времени.

Проблема в том, что какая-то функция у класса MainWindow является private(базовая функция, не мною писанная). На это он ругается и не компилит.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Форма и классы на С++

Сообщение Casperovskii »

Эту проблему решил, возникла другая, не совсем связанная с темой:
есть ли в С++ аналог функции из AS 3.0 string.split(delimiter) для создания массива из строк?
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Форма и классы на С++

Сообщение Casperovskii »

Всем привет! Не стал создавать новую тему, возникла очередная проблема с С++. боролся месяц, сам не смог победить. Хабр, друзья и другой форум не помогли . Итак, у меня есть во Flash:

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

public function dataWrite(e:Event):void {            clientSocket.writeUTFBytes(fieldToWrite.text);//сокет, подключенный к серву на QT            clientSocket.flush();            trace(clientSocket.bytesAvailable, clientSocket.connected);            fieldToWrite.text = "";//текстовое поле, из которого берем строку для передачи            fieldToWrite.setFocus();        }
И код функции на сервере, которая должна срабатывать каждый раз, когда любой из клиентов посылает строчку:
Код:

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

void multiServer::sendDataToForm(int socDesc, QString txt){    qDebug()<<listOfThreads.size(); //листстредов - всех клиентов, выводим его размер    qDebug()<<txt;//считанный с любого из клиентов текст    QString txt2 = QString::number(socDesc) + ";" + txt;    emit sendingData(MainWindow::DATAINCOME,txt2);//отправляем считанный текст в гуи    for (int i = 0;i<listOfThreads.size();i++) //цикл отправки всем клиентам сообщения    {        QByteArray myByteArray;//отправляем        listOfThreads[i]->socket->write(myByteArray.append(QString("Client written;") + QString::number(socDesc) + ";" + txt));        qDebug()<<myByteArray;    }}
Проблема в следующем: если отсутствует цикл, то сервер считывает все сообщения прекрасно, но, естественно, ничего не отсылает назад. Если цикл есть, то сервер считывает первое сообщение, отсылает его всем клиентам и больше не может считать ни одного сообщения, кроме вновь подключившегося клиента. Добавление в цикл для сокета функций waitforreadyread() и flush() не помогло. Прошу вашей помощи. Спасибо за внимание.

P.S. Если нужен другой код (объявление треда или код самого треда и так далее, готов предоставить. Но проблема именно в цикле/отправке данных обратно на клиент).


Тема поднималась пользователем Casperovskii 11 май 2013, 12:56.
Ответить