Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 102
1

О структуризации кода

30.08.2014, 19:30. Просмотров 805. Ответов 9
Метки нет (Все метки)

У меня в последние дни возникает множество вопросов, связанных с реализацией грамотной структуры кода. Я хочу чтоб мои проекты были с учётом "хорошего тона программирования в С++". Вопросов касательно конкретно структурирования кода много, так что буду последователен.

Объясню что имеется и что требуется...
Есть структуры, которые используются в большинстве остальные классов проекта. Значится объекты данных структур нужно создавать на глобальном уровне, верно? Дело в том, что члены-элементы и члены-методы данных структур, которые периодически( в зависимости от условий ) используются( кстати, и модифицируются ) в различных классах проекта. Получается, мне нужен прямой доступ к этим структурам и любого класса проекта. Как правильно это реализовать? Какие способы есть?
Раньше я создавал объект сразу после описания структуры типа так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Symbol_Properties
{
   datetime    gdt_Quote;           // Время поступления последней котировки
   double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   double      gd_Spread;           // Размер спреда в пунктах
   double      gd_Swap;             // Своп
   double      gd_Comission;        // Комиссия
   double      gd_Pt;               // Величина одного пункта
   int         gi_Digits;           // Количество знаков в цене после запятой
   int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};
Но это же не самый лучший вариант. Вот и спрашиваю...
Причём, те классы которые используют члены данных структур должны обращаться, именно, к тем копиям структуры, а значит и тому же конкретному объекту, к которому обращаются остальные класса.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2014, 19:30
Ответы с готовыми решениями:

Советы по ускорению работы кода + оценка самого кода
Вчера вечером сел написать 3 консольные программки для работы с шаблонами размножения текста:...

Вынести основную часть кода кода в отдельную функцию
помогите пожалуйста переделать это на функцию... #include <locale.h> #include <conio.h> int...

Исправление кода. Функция по нахождение суммы между мин и макс показателями массива. Корректировка кода
Прошу помощи. Написал программку, проблема состоит в функции summ в ней происходит нахождение...

Грамотная отладка программы, подмога в структуризации кода
Сразу прошу прощения, если ошибся разделом. Написал программу. Она простая. Она сжимает...

9
3237 / 2045 / 350
Регистрация: 24.11.2012
Сообщений: 4,894
30.08.2014, 19:49 2
Передавать объекты в методы/конструкторы где они нужны по ссылке/указателю.
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 102
30.08.2014, 21:15  [ТС] 3
Цитата Сообщение от 0x10 Посмотреть сообщение
Передавать объекты в методы/конструкторы где они нужны по ссылке/указателю.
А создавать объекты сразу в файлах структур, после их описания? Имею ввиду так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Symbol_Properties
{
   datetime    gdt_Quote;           // Время поступления последней котировки
   double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   double      gd_Spread;           // Размер спреда в пунктах
   double      gd_Swap;             // Своп
   double      gd_Comission;        // Комиссия
   double      gd_Pt;               // Величина одного пункта
   int         gi_Digits;           // Количество знаков в цене после запятой
   int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};
Symbol_Properties SSym;
Тогда в каждый файл соответствующего класса я инклюжу файл структуры, в которой уже создан объект, как я выше показал. Так нужно?

Вот у меня класса, например.
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
class BaseInfo
{
   private:
//      static int   LotDecimal;      // Количество запятых в лоте торгового инструмента
      Symbol_Properties   SSym;
      int      IndErr;              // Индекс ошибок в массиве комментариев
      //---- Переменные Input
      bool     Bootstrap;           // Флаг успешности инициализации функции Init()
      bool     RealTrade;           // Флаг торговли On-line
      bool     VirtualTrade;        // Флаг оптимизации
      string   ExpertName;          // Имя инструмента выводимого на график
      string   Comments [8];        // Массив комментариев
   public:
      //---- Конструктор и деструктор
               BaseInfo (void);
              ~BaseInfo (void);
      //---- Сеттеры
      void     SetBootstrap (const bool fb_Bootstrap);
      void     SetRealTrade (const bool fb_RealTrade);
      void     SetVirtualTrade (const bool fb_VirtualTrade);
      //---- Геттеры
      bool     GetBootstrap() const;
      bool     GetRealTrade() const;
      bool     GetVirtualTrade() const;
      //---- Методы
      void     GetMarkerInfo (string fs_Symbol, Symbol_Properties& SSym, Position_Properties& SPos, int fi_Ticket = 0);
      bool     GetOrderDetails (int fi_Ticket);
      double   GetTradePrice (int fi_Price, bool fb_RealTrade, string fs_Symbol = "");
      double   GetPoint (string fs_Symbol = "");
      int      LotDecimal();
      void     GetPt();
};
Как в него правильно передать объект учитывая требования, которые я написал в первом посте?
Теоритически я прекрасно понимаю как это делается, но применительно к моему случаю не совсем. Если б это была обычная функция, я б через параметры так передал:
C++
1
FuncName (SSym& fi)Sym)
Но в каждый метод класса передавать объект по ссылке через параметры не лучший вариант, верно? Как это удобнее реализовать?
0
3237 / 2045 / 350
Регистрация: 24.11.2012
Сообщений: 4,894
30.08.2014, 21:19 4
Цитата Сообщение от hoz Посмотреть сообщение
А создавать объекты сразу в файлах структур, после их описания?
Не надо плодить лишних глобальных переменных.

Цитата Сообщение от hoz Посмотреть сообщение
Как в него правильно передать объект
Конкретно в этом случае я вижу, что объект класса Symbol_Properties уже существует как поле. Зачем и что еще передавать?
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 102
30.08.2014, 21:49  [ТС] 5
Цитата Сообщение от 0x10 Посмотреть сообщение
Не надо плодить лишних глобальных переменных.
А как иначе, если данные члены используются практически всеми классами проекта?

Цитата Сообщение от 0x10 Посмотреть сообщение
Конкретно в этом случае я вижу, что объект класса Symbol_Properties уже существует как поле. Зачем и что еще передавать?
В этом случает да, это эксперимент, а не окончательный вариант. В этом класса оно как поле. В другой класс ничего не передаётся. Значит не верно получается. Я ж не смогу использовать структуру Symbol_Properties как поле во всех классах, где нужно её использовать, потому что мне нужно работать не с копиями объекта данной структуры, а конкретной единственным экземпляром. Понимаете о чём я?
0
Каратель
Эксперт С++
6598 / 4019 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.08.2014, 22:48 6
Цитата Сообщение от hoz Посмотреть сообщение
а конкретной единственным экземпляром
singleton
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 102
31.08.2014, 00:06  [ТС] 7
Цитата Сообщение от Jupiter Посмотреть сообщение
singleton
Вы о чём?
0
54 / 54 / 37
Регистрация: 05.09.2013
Сообщений: 1,865
31.08.2014, 00:36 8
hoz, https://ru.wikipedia.org/wiki/... 8%D1%8F%29
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 102
31.08.2014, 01:19  [ТС] 9
Это единственный разумный вариант или есть попроще?

Я не представляю как это применить в моём случае на практике. Хотя тут всё объясняется типа приемлимо.
0
3237 / 2045 / 350
Регистрация: 24.11.2012
Сообщений: 4,894
31.08.2014, 08:55 10
Цитата Сообщение от hoz Посмотреть сообщение
мне нужно работать не с копиями объекта данной структуры, а конкретной единственным экземпляром
1. Явно удалить констукторы по умолчанию и копирования, оператор присваивания.
2. Передавть в заинтересованные классы (умный) указатель или ссылку на разделяемый объект.

В приложении наверняка есть точка, где можно создать общедоступные объекты, оставив при этом их локальными. Например, может быть класс Application:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Application {
public:
  int Run() {
    // Агент, реализующий основной алгоритм программы.
    // Использует логгер для отладочного вывода.
    Agent agent(logger_);
    agent.CalculateMySuperBusinessLogic();
  }
private:
  // Разделяемый объект логгера
  std::shared_ptr<Logger> logger_; 
};
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2014, 08:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Запись данных из listView в txt с использованием разделителя для структуризации файла
Добрый вечер. Есть небольшой вопрос, который на половину раскрыт. Есть отрезок кода: for (int i =...

Напишите фрагмент кода для определения кода нажатой клавиши (расширенного кода в том числе)
Напишите фрагмент кода для определения кода нажатой клавиши (расширенного кода в том числе)....

Замена програмно куска кода в файле .php другим куском кода
Мне необходимо програмно заменить кусок кода в файле .php Есть файл .php, в котором надо заменить...

Почему после изменения кода продолжает выполняться сценарий старого кода?
ВОПРОС Почему после изменения кода продолжает выполняться сценарий старого кода? ИМЕЕТСЯ...


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

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

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