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

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

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

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

03.04.2013, 05:24. Просмотров 847. Ответов 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, то в каждом классе, нужно будет хранить на него указатель и указывать в конструкторе, не очень удобно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 05:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Организация общения между классами (C++):

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

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

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

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

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

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

7
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
}
1
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;
}
Спасибо за помощь с логингом, что то не додумался. Почитаю про патерны.
Раньше только своей головой доходил до архитектуры. Данные: к примеру Контейнер каких то объектов.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
03.04.2013, 10:21 #4
Цитата Сообщение от flybox Посмотреть сообщение
Данные: к примеру Контейнер каких то объектов.
Этого тоже не достаточно. Опишите все сущности и способы их взаимодействия. Ну или поставьте задачу развернуто.
0
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, как то громоздко , указателями и передачей через конструкторы красивее код.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
03.04.2013, 12:45 #6
Цитата Сообщение от flybox Посмотреть сообщение
от него пойдет класс
Непонятно, что это значит. Классы могут иметь разные отношения, но отношение "пошел от него" мне не знакомо. Наследование тут явно не при чем.

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

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

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

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

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

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

Да эту схему и пробую реализовать, но чисто для практики. Я не хочу делать свой движок, а просто понять общение между классами.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
}
1
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++
Для каждого индивидуального варианта необходимо создать консольную программу на С++, реализующую отношение ассоциации (агрегации или...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
03.04.2013, 13:30
Ответ Создать тему
Опции темы

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