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

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

Восстановить пароль Регистрация
 
flybox
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 5
03.04.2013, 05:24     Организация общения между классами #1
Использую следующую конструкцию. Есть общий класс , назовем его ядро(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, то в каждом классе, нужно будет хранить на него указатель и указывать в конструкторе, не очень удобно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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     Организация общения между классами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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     Организация общения между классами
Ответ Создать тему
Опции темы

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