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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
#1

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

26.02.2014, 11:50. Просмотров 1355. Ответов 11
Метки нет (Все метки)

Понимаю что это основы, но что-то я запутался...
Есть основной класс программы MainWindow. Есть другой класс (назовем его MyClass). В WainWindow создается экземпляр MyClass. Также в MainWindow есть некий массив с данными. Как внутри MyClass получить доступ к этим данным? Если бы всё было в обратную сторону (получить доступ к данным в MyClass из MainWindow), тогда всё понятно, у нас уже есть созданный экземпляр класса MyClass. А в данном случае - не понятно. Не создавать же экземпляр класса MainWindow, он же уже поидее где-то создан при запуске приложения (я так понимаю это происходит в main.cpp). Так вот как обратиться к этому экземпляру из MyClass? Или я координально ошибаюсь в своих рассуждениях?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2014, 11:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача данных между классами (C++):

Передача данных между классами - C++
Здравствуйте! Программирую графику на C++ под DirectX9, если точнее то пытаюсь написать простой редактор 3D графики. есть класс...

Передача std::vector между классами - C++
Класс Data служит для инициализации переменных. Класс А - для обработки данных. В классе А меняются данные в контейнере std::vector (размер...

Передача данных между потоками - C++
Есть сервер. Для каждого клиента он создает новый поток и работает с ними независимо от остальных...Например мне надо чтобы получив...

Передача данных между двумя приложениями. - C++
Суть проблемы такова: есть приложение на с#, производящее вычисления, результатом является массив данных. Есть прога на с++ + QT, умеющая...

Взаимодействие между классами - C++
Суть проблемы такова: в одном файле classy.h объявлено несколько классов (classcontrol, class1, class2,class3). Необходимо сделать так,...

Взаимодействие между классами - C++
При попытке создать указатель на объект класса в public секции другого класса из которого будет обращение к его методу... Cook *cok ...

11
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.02.2014, 11:56 #2
Передавайте в конструктор MyClass указатель на MainWindow для начала.
1
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 12:19  [ТС] #3
А можно поподробнее, как это сделать?

Добавлено через 12 минут
Разобрался. Большое спасибо!
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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;
};
0
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 12:26  [ТС] #5
Не пойму, в чем разница, когда я объявляю переменную в MyClass.h внутри описания класса после классификатора "private:", и когда объявляю переменную в начале файла MyClass.cpp после include'ов?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.02.2014, 12:57 #6
Haamu, две строчки кода заменяют тысячи слов.
Приведите код
0
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);
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.02.2014, 14:36 #8
Цитата Сообщение от Haamu Посмотреть сообщение
компилятор сообщает, что MainWindow не является именем типа данных.
Вероятно потому, что не знает в этот момент, что такое MainWindow. Можно решить добавлением предварительного объявления перед классом Pipe (внутри pipe.h):
C++
1
class MainWindow;
Там, где будете вызывать методы, уже нужно знать "потроха" MainWindow, т.е. сделать:
C++
1
#include "mainwindow.h"
Цитата Сообщение от Haamu Посмотреть сообщение
У меня вот таким образом объявлен конструктор моего класса:
Значит надо переделать конструктор, чтобы один из параметров был указателем на MainWindow.
0
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;
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.02.2014, 15:18 #10
Haamu, если в данном случае parent являет MainWindow, то можно и без дополнительного параметра:
C++
1
mw = dynamic_cast<MainWindow*>(parent);
0
Haamu
1 / 1 / 0
Регистрация: 19.12.2013
Сообщений: 43
26.02.2014, 15:26  [ТС] #11
В общих чертах понятно, осталось погуглить, чтобы уложить в голове некоторые мелкие моменты. Большое спасибо за помощь. На большинстве форумах, где искал информацию об этом, вместо объяснений отсылают читать книжки по C++.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.02.2014, 15:28 #12
Цитата Сообщение от Haamu Посмотреть сообщение
вместо объяснений отсылают читать книжки по C++.
Это оч. сильно зависит от того, какой вопрос задают
0
26.02.2014, 15:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2014, 15:28
Привет! Вот еще темы с ответами:

Связь между 2 классами - C++
Есть 2 класса: Class A { private: B** arrayB;/нужно раньше объявить класс И ... }; A* Object

Реализация отношений между классами is-a, has-a, uses-a в С++ - C++
Где можно найти информацию по отношениям между объектами классов is-a, has-a, uses-a и и их реализация средствами С++. В инете очень мало...

Организация общения между классами - C++
Использую следующую конструкцию. Есть общий класс , назовем его ядро(Core) от него идут 2 след класса Graphics и Data. Задача следующая...

Отличия между структурами и классами - C++
Объясните пожалуйста, в С++, получается, что структура отличается от класса только тем, что у нее по умолчанию все данные public? Т.е....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru