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

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

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

Организация общения между классами - C++

03.04.2013, 05:24. Просмотров 788. Ответов 7
Метки нет (Все метки)

Использую следующую конструкцию. Есть общий класс , назовем его ядро(Core) от него идут 2 след класса Graphics и Data. Задача следующая нужно, чтобы класс Graphics мог получать данные от Data. В главном классе Core я создаю указатели на классы Graphics и Engine, а также в конструкторе(core) создаю объекты данных классов. В классе Graphics создаю указатель на класс Data. И в конструкторе Graphics присваиваю этому указателю , указатель на объект, который создается в классе Core.

Правильную ли я выбрал схему или есть проще решения?

Привожу код, как это работает:

Класс A - Core
Класс B - Graphics
Класс C - Data

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
 
using namespace std;
class B;
class C;
 
class A
{
private:
 
public:
    A();
    ~A();
    C* ptr_C;
    B* ptr_B; //
    int x;
};
 
class B
{
private:
public:
    int lot;
    B(C*);
    ~B();
    C* ptr_C;
};
 
class C
{
private:
public:
    int boo;
    C();
    ~C();
};
 
C::C()
{
boo = 555;
}
 
A::A()
{
x = 55;
ptr_C = new C();
ptr_B = new B(ptr_C);
 
}
 
B::B(C *p)
{
    ptr_C = p;
    lot = 6;
    cout << ptr_C->boo << endl;
}
 
int main()
{
    A* MyTestClass1 = new A();
    cout << MyTestClass1->ptr_B->lot << endl;
    cin.get();
    return 0;
}
Просто допустим , если сюда добавить систему логирования , некий класс LogSystem, то в каждом классе, нужно будет хранить на него указатель и указывать в конструкторе, не очень удобно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 05:24     Организация общения между классами
Посмотрите здесь:

Программа общения между людьми с шифровкой даных - C++
Необходимо создать программу для общения между людьми..Также можно с шифровкой данных...

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

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

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

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

Отношения между классами и объектами - C++
Для каждого индивидуального варианта необходимо создать консольную программу на С++, реализующую отношение ассоциации (агрегации или...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
03.04.2013, 09:47     Организация общения между классами #2
Цитата Сообщение от flybox Посмотреть сообщение
Задача следующая нужно, чтобы класс Graphics мог получать данные от Data.
Это очень размытая задача. Нужно конкретнее знать что за данные, когда получать... Может тут подойдет паттерн visitor или subscruber.

Добавлено через 5 минут
А с логгингом-то какая беда? Вот примитивный логгинг. Конечно, надо бы влепить фабрику или менеджер логгеров, но для простых решений сойдет просто указание потока в конкретном классе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iterator>
#include <iostream>
#include <istream>
#include <string>
#include <functional>
 
class Logger {
 public:
  Logger(std::ostream &outputStream, const std::string &facility)
    : outputStream(outputStream), facility(facility) {}
  void log(const std::string &message) {
    outputStream << facility << ": " << message << std::endl;
  }
  void error(const std::string &message) {
    log("ERROR: " + message);
  }
  void warning(const std::string &message) {
    log("WARNING: " + message);
  }
  void info(const std::string &message) {
    log("INFO: " + message);
  }
 private:
  std::ostream &outputStream;
  std::string facility;
};
 
 
class Core {
 public:
  Core() {
    log.info("created.");
  }
  virtual ~Core() {
    log.info("destroyed.");
  }
 private:
  static Logger log;
};
Logger Core::log(std::cout, "Core");
 
class Data {
 public:
  Data() {
    log.info("created.");
  }
  virtual ~Data() {
    log.info("destroyed.");
  }
 private:
  static Logger log;
};
Logger Data::log(std::cout, "Data");
 
int main(int argc, char *argv[]) {
  Core core;
  Data data;
  
  std::cin.get();
  return 0;
}
flybox
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 5
03.04.2013, 10:17  [ТС]     Организация общения между классами #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Это очень размытая задача. Нужно конкретнее знать что за данные, когда получать... Может тут подойдет паттерн visitor или subscruber.

Добавлено через 5 минут
А с логгингом-то какая беда? Вот примитивный логгинг. Конечно, надо бы влепить фабрику или менеджер логгеров, но для простых решений сойдет просто указание потока в конкретном классе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iterator>
#include <iostream>
#include <istream>
#include <string>
#include <functional>
 
class Logger {
 public:
  Logger(std::ostream &outputStream, const std::string &facility)
    : outputStream(outputStream), facility(facility) {}
  void log(const std::string &message) {
    outputStream << facility << ": " << message << std::endl;
  }
  void error(const std::string &message) {
    log("ERROR: " + message);
  }
  void warning(const std::string &message) {
    log("WARNING: " + message);
  }
  void info(const std::string &message) {
    log("INFO: " + message);
  }
 private:
  std::ostream &outputStream;
  std::string facility;
};
 
 
class Core {
 public:
  Core() {
    log.info("created.");
  }
  virtual ~Core() {
    log.info("destroyed.");
  }
 private:
  static Logger log;
};
Logger Core::log(std::cout, "Core");
 
class Data {
 public:
  Data() {
    log.info("created.");
  }
  virtual ~Data() {
    log.info("destroyed.");
  }
 private:
  static Logger log;
};
Logger Data::log(std::cout, "Data");
 
int main(int argc, char *argv[]) {
  Core core;
  Data data;
  
  std::cin.get();
  return 0;
}
Спасибо за помощь с логингом, что то не додумался. Почитаю про патерны.
Раньше только своей головой доходил до архитектуры. Данные: к примеру Контейнер каких то объектов.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
03.04.2013, 10:21     Организация общения между классами #4
Цитата Сообщение от flybox Посмотреть сообщение
Данные: к примеру Контейнер каких то объектов.
Этого тоже не достаточно. Опишите все сущности и способы их взаимодействия. Ну или поставьте задачу развернуто.
flybox
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 5
03.04.2013, 10:43  [ТС]     Организация общения между классами #5
Цитата Сообщение от lemegeton Посмотреть сообщение
Этого тоже не достаточно. Опишите все сущности и способы их взаимодействия. Ну или поставьте задачу развернуто.
Задача следующая. У нас есть 4 класса (Core,Graphics,ManagerGraphicsModels,Meshes)

Core - Ядро в котором мы храним указатели на Graphics и ManagerGraphicsModels(Загружает и хранит в себе данные о мешах) от него пойдет класс/структура Meshes(сами сетки).
В классе ManagerGraphicsModels есть контейнер объектов Meshes.

Задача класса Graphics осуществить отображение (Render) моделей из контейнера в классе ManagerGraphicsModels.
Вот минимальная схема взаимодействия.

Почитал про паттерн Visitor, как то громоздко , указателями и передачей через конструкторы красивее код.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
03.04.2013, 12:45     Организация общения между классами #6
Цитата Сообщение от flybox Посмотреть сообщение
от него пойдет класс
Непонятно, что это значит. Классы могут иметь разные отношения, но отношение "пошел от него" мне не знакомо. Наследование тут явно не при чем.

Не понятно, в чем идея класса ManagerGraphicsModels. Фабрика мешей? В чем смысл?

Я так понял, что вы собираете некий велосипед, умеющий рендерить различные фигуры из мешей. Приведенную схему, к сожалению ил счастью, можно реализовать множеством способов. Хранение объектом одного класса коллекции объектов другого класса -- это вполне нормально.

Рассмотрите диспетчеризацию и двойную диспетчеризацию.
flybox
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 5
03.04.2013, 12:58  [ТС]     Организация общения между классами #7
Цитата Сообщение от lemegeton Посмотреть сообщение
Непонятно, что это значит. Классы могут иметь разные отношения, но отношение "пошел от него" мне не знакомо. Наследование тут явно не при чем.

Не понятно, в чем идея класса ManagerGraphicsModels. Фабрика мешей? В чем смысл?

Я так понял, что вы собираете некий велосипед, умеющий рендерить различные фигуры из мешей. Приведенную схему, к сожалению ил счастью, можно реализовать множеством способов. Хранение объектом одного класса коллекции объектов другого класса -- это вполне нормально.

Рассмотрите диспетчеризацию и двойную диспетчеризацию.
Класс ManagerGraphicsModels - Некий класс управления мешами, к примеру грузит их из файла и хранит в хранилище.
Под фразой пошел от него, я имею ввиду одностороннюю связь через хранения указателя. Тоесть класс ManagerGraphicsModels не должен знать и управлять классом Core, а класс Core может управлять классом ManagerGraphicsModels. Получается это некие уровни абстракции.

Да эту схему и пробую реализовать, но чисто для практики. Я не хочу делать свой движок, а просто понять общение между классами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2013, 13:30     Организация общения между классами
Еще ссылки по теме:

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

Передача данных между классами - C++
Понимаю что это основы, но что-то я запутался... Есть основной класс программы MainWindow. Есть другой класс (назовем его MyClass). В...

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

Сформируйте взаимное дружественное отношение между классами - C++
Помогите разобраться. есть такое задание: Модифицируйте классы Tv и Remote следующим образом: а. Сформируйте взаимное дружественное...

Программа в которой реализируется взаимодействия между классами - C++
Здравствуйте. Помогите разобраться, как написать программу в которой нужно реализовать взаимодействия между классам на С++.


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

Или воспользуйтесь поиском по форуму:
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
03.04.2013, 13:30     Организация общения между классами #8
Можно реализовать как-то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iterator>
#include <iostream>
#include <istream>
#include <string>
#include <functional>
#include <list>
 
// отрисовывает примитивы
class Surface {
 public:
  // тут находится то, с помощью чего mesh рисуется
  void drawLine(/* */) {} // например линии...
  void drawText(const std::string &message) {
    std::cout << message << std::endl;
  }
};
 
// отрисовывает модель на поверхности
class Mesh {
 public:
  void draw(Surface *surface) {
    surface->drawText("A mesh is drawn on surface.");
    //... ... ...
  }
};
 
// класс осуществляет доступ к набору Mesh'ей
// сохранять, извлекать, предоставлять доступ, короче
// нужно реализовать по-удобнее, конечно
class MeshSource {
 public:
  typedef std::list<Mesh*>::const_iterator ConstIterator;
  void addMesh(Mesh *mesh) {
    data.push_back(mesh);
  }
  ConstIterator begin() const { return data.begin(); }
  ConstIterator end() const { return data.end(); }
 private:
  std::list<Mesh*> data;
};
 
// умеет отрисовывать набор мешей
// в данном примере весь источник данных
class Graphics {
 public:
  Graphics(MeshSource *meshSource, Surface *surface) :
    meshSource(meshSource), surface(surface) {}
  void draw() {
    for (MeshSource::ConstIterator mesh = meshSource->begin();
      mesh != meshSource->end(); ++mesh) {
      (*mesh)->draw(surface);
    }
  }
 private:
  MeshSource *meshSource;
  Surface *surface;
};
 
int main(int argc, char *argv[]) {
  MeshSource meshes;
  meshes.addMesh(new Mesh());  
  meshes.addMesh(new Mesh());  
  meshes.addMesh(new Mesh());  
  meshes.addMesh(new Mesh());  
  
  Surface surface;
  Graphics graphics(&meshes, &surface);
  
  graphics.draw();
  
  std::cin.get();
  return 0;
}
Yandex
Объявления
03.04.2013, 13:30     Организация общения между классами
Ответ Создать тему
Опции темы

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