Передача данных между классами

Понимаю что это основы, но что-то я запутался... Есть основной класс программы MainWindow. Есть другой класс (назовем его MyClass). В WainWindow создается экземпляр MyClass. Также в MainWindow есть некий массив с данными. Как внутри MyClass получить доступ к этим данным? Если бы всё было в обратную сторону (получить доступ к данным в MyClass из MainWindow), тогда всё понятно, у нас уже есть созданный экземпляр класса MyClass. А в данном случае - не понятно. Не создавать же экземпляр класса MainWindow, он же уже поидее где-то создан при запуске приложения (я так понимаю это происходит в main.cpp). Так вот как обратиться к этому экземпляру из MyClass? Или я координально ошибаюсь в своих рассуждениях?
11 ответов

Передавайте в конструктор MyClass указатель на MainWindow для начала.


А можно поподробнее, как это сделать?Разобрался. Большое спасибо!


class MyClass
{
public:
   MyClass( MainWindow* w ) : w(w) { /*... */ }
   Action() { w-> ... /* используем методы из MainWindow */ }
private:
   MainWindow* w;
};


Не пойму, в чем разница, когда я объявляю переменную в MyClass.h внутри описания класса после классификатора "private:", и когда объявляю переменную в начале файла MyClass.cpp после include'ов?


Haamu, две строчки кода заменяют тысячи слов. Приведите код


Прошу прощение за сумбур. Что в голове, то и в тексте получилось. Сделал немного подругому. Это часть кода из Pipe.cpp:
#include "pipe.h"
#include "mainwindow.h"
 
MainWindow *mw;
 
Pipe::Pipe(QWidget *parent, GLfloat x_Rot, GLfloat y_Rot, GLfloat z_Rot) :
    QGLWidget(parent)
{
    /*...*/
 
    mw = (MainWindow *)parent;
}
Pipe собственно и есть тот самый "MyClass". Так всё заработало. Когда объявляю указатель MainWindow *mw; как у Вас:
private: MainWindow* w;
компилятор сообщает, что MainWindow не является именем типа данных. Вот и спрашиваю, в том ли месте я объявил указатель. Хочется чтобы не только работало, но и было правильно написано.
MyClass( MainWindow* w ) : w(w) { /*... */ }
А вот этот момент я не понял. У меня вот таким образом объявлен конструктор моего класса:
class Pipe : public QGLWidget
{
public:
    Pipe(QWidget *parent = 0, GLfloat x_Rot = 0, GLfloat y_Rot = 0, GLfloat z_Rot = 0);


компилятор сообщает, что MainWindow не является именем типа данных.
Вероятно потому, что не знает в этот момент, что такое MainWindow. Можно решить добавлением предварительного объявления перед классом Pipe (внутри pipe.h):
class MainWindow;
Там, где будете вызывать методы, уже нужно знать "потроха" MainWindow, т.е. сделать:
#include "mainwindow.h"
У меня вот таким образом объявлен конструктор моего класса:
Значит надо переделать конструктор, чтобы один из параметров был указателем на MainWindow.


Значит надо переделать конструктор, чтобы один из параметров был указателем на MainWindow.
То есть помимо perent'а и других параметров добавить еще и указатель на MainWindow?
Pipe(MainWindow *mw, QWidget *parent = 0, GLfloat x_Rot = 0, GLfloat y_Rot = 0, GLfloat z_Rot = 0);
Тогда получается, при вызове конструктора получится что-то вроде:
Pipe pipeY= new Pipe(this, this, -90, 0, 0);
Так? А зачем? Не проще в реализации конструктора добавить:
mw = (MainWindow *)parent;


Haamu, если в данном случае parent являет MainWindow, то можно и без дополнительного параметра:
mw = dynamic_cast<MainWindow*>(parent);


В общих чертах понятно, осталось погуглить, чтобы уложить в голове некоторые мелкие моменты. Большое спасибо за помощь. На большинстве форумах, где искал информацию об этом, вместо объяснений отсылают читать книжки по C++.


вместо объяснений отсылают читать книжки по C++.
Это оч. сильно зависит от того, какой вопрос задают