Russian Qt Forum

Программирование => С/C++ => Тема начата: PulSar.CE3194694 от Август 05, 2010, 08:43



Название: [Решено] Обращение к членам класса из другого класса
Отправлено: PulSar.CE3194694 от Август 05, 2010, 08:43
Добрый день!
Есть два класса: class MainWindow и class MyWidget. В классе главного окна объявлены поле и массив:
Код:
int M;
QPointF *MyArray;
Случилось так, что некоторые функции из класса MyWidget должны обратиться к этому массиву и полю для счета данных из них. Подскажите, пожалуйста, каким образом это можно сделать? Запись вроде MainWindow::M и MainWindow::MyArray приводит к ошибке (массив и поле находятся в public секции).


Название: Re: Обращение к членам класса из другого класса
Отправлено: kuzulis от Август 05, 2010, 09:21
Вариантов несколько:

1.

В конструкторе MyWidget добавить указатели на MainWindow::M и MainWindow::MyArray
Код:
class MyWidget : public QWidget {

    Q_OBJECT

public:
    ....
    MyWidget (int *pM, QPointF *pMyArray, QWidget *parent = 0)
        : QQWidget(parent), m_pM(pM), m_pMyArray(pMyArray){
    }
    ....
private:
    int *m_pM;
    QPointF *m_pMyArray;
    //
    int getM() const { return *m_pM; } // <== вот тут мы получаем значение m
 

но это кривое решение.

2.

1)В MyWidget  сделать

сигнал типа:
Код:
    void signalGetM();
слот типа:
Код:
public slots:
    void slotGetM(int m) { //тут используем значение переменной m }

2). В MainWindow сделать:
сингал типа:
Код:
    void signalGetM(int);
слот типа:
Код:
public slots:
    void slotGetM() { emit signalGetM(this->M); }

3. В конструкторе MainWindow (или где нить еще) коннектим:
Код:
    connect(MyWidget, SIGNAL(signalGetM()), this, SLOT(slotGetM()));
    connect(this, SIGNAL(signalGetM(int)), MyWidget, SLOT(slotGetM(int)));

4. Для того чтобы в MyWidget  получить данные от MainWindow , мы в каком либо методе MyWidget  делаем:
Код:
...
emit signalGetM();
...
и, следовательно после отправки этого сигнала мы в слот void MyWidget::slotGetM(int m) получим значение m и можем делать с ним что нам нужно.

т.е. обмен типа такой:
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
Уже разобрался, спасибо