Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 11:50     Передача данных между классами #1
Понимаю что это основы, но что-то я запутался...
Есть основной класс программы MainWindow. Есть другой класс (назовем его MyClass). В WainWindow создается экземпляр MyClass. Также в MainWindow есть некий массив с данными. Как внутри MyClass получить доступ к этим данным? Если бы всё было в обратную сторону (получить доступ к данным в MyClass из MainWindow), тогда всё понятно, у нас уже есть созданный экземпляр класса MyClass. А в данном случае - не понятно. Не создавать же экземпляр класса MainWindow, он же уже поидее где-то создан при запуске приложения (я так понимаю это происходит в main.cpp). Так вот как обратиться к этому экземпляру из MyClass? Или я координально ошибаюсь в своих рассуждениях?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.02.2014, 11:56     Передача данных между классами #2
Передавайте в конструктор MyClass указатель на MainWindow для начала.
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 12:19  [ТС]     Передача данных между классами #3
А можно поподробнее, как это сделать?

Добавлено через 12 минут
Разобрался. Большое спасибо!
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.02.2014, 12:21     Передача данных между классами #4
C++
1
2
3
4
5
6
7
8
class MyClass
{
public:
   MyClass( MainWindow* w ) : w(w) { /*... */ }
   Action() { w-> ... /* используем методы из MainWindow */ }
private:
   MainWindow* w;
};
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 12:26  [ТС]     Передача данных между классами #5
Не пойму, в чем разница, когда я объявляю переменную в MyClass.h внутри описания класса после классификатора "private:", и когда объявляю переменную в начале файла MyClass.cpp после include'ов?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.02.2014, 12:57     Передача данных между классами #6
Haamu, две строчки кода заменяют тысячи слов.
Приведите код
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 14:29  [ТС]     Передача данных между классами #7
Прошу прощение за сумбур. Что в голове, то и в тексте получилось.
Сделал немного подругому. Это часть кода из Pipe.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#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; как у Вас:
Цитата Сообщение от Tulosba Посмотреть сообщение
private:
MainWindow* w;
компилятор сообщает, что MainWindow не является именем типа данных.
Вот и спрашиваю, в том ли месте я объявил указатель. Хочется чтобы не только работало, но и было правильно написано.

Цитата Сообщение от Tulosba Посмотреть сообщение
MyClass( MainWindow* w ) : w(w) { /*... */ }
А вот этот момент я не понял.
У меня вот таким образом объявлен конструктор моего класса:
C++
1
2
3
4
class Pipe : public QGLWidget
{
public:
    Pipe(QWidget *parent = 0, GLfloat x_Rot = 0, GLfloat y_Rot = 0, GLfloat z_Rot = 0);
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.02.2014, 14:36     Передача данных между классами #8
Цитата Сообщение от Haamu Посмотреть сообщение
компилятор сообщает, что MainWindow не является именем типа данных.
Вероятно потому, что не знает в этот момент, что такое MainWindow. Можно решить добавлением предварительного объявления перед классом Pipe (внутри pipe.h):
C++
1
class MainWindow;
Там, где будете вызывать методы, уже нужно знать "потроха" MainWindow, т.е. сделать:
C++
1
#include "mainwindow.h"
Цитата Сообщение от Haamu Посмотреть сообщение
У меня вот таким образом объявлен конструктор моего класса:
Значит надо переделать конструктор, чтобы один из параметров был указателем на MainWindow.
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 15:15  [ТС]     Передача данных между классами #9
Цитата Сообщение от Tulosba Посмотреть сообщение
Значит надо переделать конструктор, чтобы один из параметров был указателем на MainWindow.
То есть помимо perent'а и других параметров добавить еще и указатель на MainWindow?
C++
1
Pipe(MainWindow *mw, QWidget *parent = 0, GLfloat x_Rot = 0, GLfloat y_Rot = 0, GLfloat z_Rot = 0);
Тогда получается, при вызове конструктора получится что-то вроде:
C++
1
Pipe pipeY= new Pipe(this, this, -90, 0, 0);
Так? А зачем? Не проще в реализации конструктора добавить:
C++
1
mw = (MainWindow *)parent;
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.02.2014, 15:18     Передача данных между классами #10
Haamu, если в данном случае parent являет MainWindow, то можно и без дополнительного параметра:
C++
1
mw = dynamic_cast<MainWindow*>(parent);
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 15:26  [ТС]     Передача данных между классами #11
В общих чертах понятно, осталось погуглить, чтобы уложить в голове некоторые мелкие моменты. Большое спасибо за помощь. На большинстве форумах, где искал информацию об этом, вместо объяснений отсылают читать книжки по C++.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2014, 15:28     Передача данных между классами
Еще ссылки по теме:

Передача std::vector между классами C++
C++ Взаимодействие между классами
Связь между 2 классами C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.02.2014, 15:28     Передача данных между классами #12
Цитата Сообщение от Haamu Посмотреть сообщение
вместо объяснений отсылают читать книжки по C++.
Это оч. сильно зависит от того, какой вопрос задают
Yandex
Объявления
26.02.2014, 15:28     Передача данных между классами
Ответ Создать тему
Опции темы

Текущее время: 06:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru