Название: [Решено] Обращение к членам класса из другого класса Отправлено: PulSar.CE3194694 от Август 05, 2010, 08:43 Добрый день!
Есть два класса: class MainWindow и class MyWidget. В классе главного окна объявлены поле и массив: Код: int M; Название: Re: Обращение к членам класса из другого класса Отправлено: kuzulis от Август 05, 2010, 09:21 Вариантов несколько:
1. В конструкторе MyWidget добавить указатели на MainWindow::M и MainWindow::MyArray Код: class MyWidget : public QWidget { но это кривое решение. 2. 1)В MyWidget сделать сигнал типа: Код: void signalGetM(); Код: public slots: 2). В MainWindow сделать: сингал типа: Код: void signalGetM(int); Код: public slots: 3. В конструкторе MainWindow (или где нить еще) коннектим: Код: connect(MyWidget, SIGNAL(signalGetM()), this, SLOT(slotGetM())); 4. Для того чтобы в MyWidget получить данные от MainWindow , мы в каком либо методе MyWidget делаем: Код: ... т.е. обмен типа такой: 1. MyWidget говорит MainWindow-у : а дай ка мне значение M 2. MainWindow отвечает MyWidget-у : а на-ка тебе значение M :) --- Можно придумать и еще шо нить.. Название: Re: Обращение к членам класса из другого класса Отправлено: PulSar.CE3194694 от Август 05, 2010, 09:32 Спасибо! А почему через конструктор - это кривое решение?))
Название: Re: Обращение к членам класса из другого класса Отправлено: kuzulis от Август 05, 2010, 09:41 Потому что, раз виджеты - это объекты и т.п. - то обмениматься между ними данными нужно через сигналы/слоты.
Так надо! И всё тут! :) Название: Re: Обращение к членам класса из другого класса Отправлено: BRE от Август 05, 2010, 10:18 Спасибо! А почему через конструктор - это кривое решение?)) Потому, что эти классы становятся зависимыми друг от друга.При изменении одного класса (например, поменялись имена этих переменных или способов их хранения), придется изменять оба класса. Реализация каждого класса должна быть "закрыта" от внешнего мира и общаться с ним через заранее определенный интерфейс. Название: Re: Обращение к членам класса из другого класса Отправлено: PulSar.CE3194694 от Август 05, 2010, 10:39 Понятно, спасибо, это видимо тонкости языка.
Название: Re: Обращение к членам класса из другого класса Отправлено: m_ax от Август 05, 2010, 10:52 Цитировать Запись вроде MainWindow::M и MainWindow::MyArray приводит к ошибке (массив и поле находятся в public секции). Неудивительно)Где вы видели, чтоб так обращались к членам класса? Название: Re: Обращение к членам класса из другого класса Отправлено: BRE от Август 05, 2010, 11:08 Неудивительно) Не забывай про статические члены класса. ;)Где вы видели, чтоб так обращались к членам класса? Название: Re: Обращение к членам класса из другого класса Отправлено: Igors от Август 05, 2010, 13:33 Спасибо! А почему через конструктор - это кривое решение?)) Кривой не способ/принцип, а его конкретная реализация. Число элементов M и указатель на массив живут в MainWindow. Вы делаете их также и членами MyWidget. Если они будут изменены внутри MainWindow - тогда MyWidget остается со старыми невалидными данными, и надо будет как-то (коряво) это лататьВозьмите QVector <QPointF>, из которого всегда можно получить С массив. Подайте указатель на этот вектор в конструктор MyWidget - и проблем не будет А также надо подумать нужен ли вообще такой член MyWidget. Может когда MyWidget собрался считать этот массив - тогда ему и дать его как аргумент ф-ции. Название: Re: Обращение к членам класса из другого класса Отправлено: PulSar.CE3194694 от Август 05, 2010, 14:17 Уже разобрался, спасибо
|