Страница 1 из 1
Форма и классы на С++
Добавлено: 03 фев 2013, 14:20
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 со всеми вытекающими. Есть ли другие варианты?
Re: Форма и классы на С++
Добавлено: 03 фев 2013, 15:44
Alazaur
Casperovskii, ну да в классе multiServer сделать указатель на объект.
Re: Форма и классы на С++
Добавлено: 03 фев 2013, 18:26
Casperovskii
Alazaur
Мне необходимо и обратное взаимодействие... Чтобы из формы можно было обратится к mulriServer.
Re: Форма и классы на С++
Добавлено: 03 фев 2013, 19:34
Alazaur
ну сделать перекрестные указатели. правда есть вероятность при удалении одного из объектов, в другом указатель будет ссылаться на неопределенное место в памяти. Безопаснее наверно будет сделать класс-хелпер со статическими переменными и работать через него.
Ну это то что в голову приходит, а вообще скорее всего есть решение изящнее, х.з. у меня знания C++ теоретические в рамках институтской программы. )))
Re: Форма и классы на С++
Добавлено: 03 фев 2013, 22:14
Casperovskii
Alazaur
Можно пример с заголовочными файлами и самими классами? Потому что я намучался уже, не могу никак понять, что не так. Эти объекты точно не будут удаляться. У меня уже руки опускаются. 3 дня сижу на одном месте из-за такой фигни.
Re: Форма и классы на С++
Добавлено: 04 фев 2013, 03:19
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);}
Если смущает что в заголовочных файлах перекрестное объявление классов можно или создать третий общий для них или сунуть оба класса в один заголовок.
Re: Форма и классы на С++
Добавлено: 04 фев 2013, 21:32
Casperovskii
Alazaur
Практически осилил, но возникли некоторые проблемы... И да, я пишу код в Qt, поэтому прошу помощи через скайп, который выслал в личку. Я думаю, это не отнимет много времени.
Проблема в том, что какая-то функция у класса MainWindow является private(базовая функция, не мною писанная). На это он ругается и не компилит.
Re: Форма и классы на С++
Добавлено: 05 фев 2013, 18:22
Casperovskii
Эту проблему решил, возникла другая, не совсем связанная с темой:
есть ли в С++ аналог функции из AS 3.0 string.split(delimiter) для создания массива из строк?
Re: Форма и классы на С++
Добавлено: 11 май 2013, 12:56
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. Если нужен другой код (объявление треда или код самого треда и так далее, готов предоставить. Но проблема именно в цикле/отправке данных обратно на клиент).