Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для dimkaok
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 128

Где создавать объекты классов?

18.04.2013, 11:28. Показов 4189. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите, если есть много классов, объявленных в заголовочных файлах,
а определенных в *.cpp - файлах, и для каждого класса создается объект, где эти объекты правильно создавать.
Я создаю их там где они оказываются нужны в первый раз. Например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// A.cpp
#include "B.cpp"
class A {
    B objB;
};
 
// B.cpp
#include "A.cpp"
#include "C.cpp"
class B {
    A objA;
    C objC;
};
 
//C.cpp
#include "B.cpp"
class C {
    B objB;
};
А то у меня создание объектов разбросано по всей программе,
может это нужно делать где-то в одном месте? (обычно подключаю *.h - файлы, а не *.cpp, как здесь,
не стал писать, чтоб упростить пример)

И правильно-ли, что объекты нужно создавать только в *.cpp - файлах, а в *.h - нельзя?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2013, 11:28
Ответы с готовыми решениями:

Считается ли хорошим тоном создавать объекты классов в области глобальных переменных
Считается ли хорошим тоном создавать объекты классов в области глобальных переменных? class FX { ........ ......... };

Стек или куча: как "правильно" создавать объекты классов?
У меня несколько странновато-ламерский вопрос, но ведь в том и смысл: чтобы таких вопросов не осталось, на них один фиг сначала нужно...

Объекты классов не видны во вложенной функции одной из классов
Такая вот проблема. Есть функция play() класса Game, где создаются объекты классов Game, Character, Battle. В ней я обращаюсь к еще одной...

24
19 / 19 / 2
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 19:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от taras atavin Посмотреть сообщение
Дело не в том, что к нему нельзя достучаться, а в том, что потом ты запутаешься, что у тебя где валяется.
Обязательно запутаетесь, особенно, если писать код сдуру. Ваш первоначальный тезис — объявлять типы и объекты там, где они будут использоваться, он замечательный. Но польза от него такая же, как от совета не допускать ошибок. Программист будет ошибаться, и он будет писать объявления не там, где нужно. Рекомендуемая стратегия по уменьшению области видимости/доступа вытекает из необходимости уменьшения связности программы. Держать в голове взаимосвязи типов и объектов в программе существенно сложнее найти «потерявшуюся» переменную.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.04.2013, 19:14
Объект - такая же переменная. И связей между целыми объектами даже в суперкривом проекте меньше, чем в не ООП проекте на аналогичную тему скалярных переменных, которые могут потеряться. Кроме того, связи эти вытекают из логики проекта, ассоциируются в мозгу и держатся лучше, чем названия пальцев, не говоря про скалярные переменные. В человеческой памяти не противоречивая структура связей между объектами вся - одна единица хранения. Один гигантский байт. И забыть его суперсложно, он для этого слишком громоздок. Если же связи до такой степени не ассоциируются, если каждое поле само по себе, то или проект кривой, или бросай программирование.
0
19 / 19 / 2
Регистрация: 30.03.2013
Сообщений: 35
18.04.2013, 19:24
Цитата Сообщение от taras atavin Посмотреть сообщение
Проблема таких отвлечённых рекомендаций в том, что всегда найдётся псих, который посоветует всё в глобал вытащить и "обоснует" это тем, что всего лишь один объект не является частью другого.
Рекомендация это не правило, а из ее обоснования должно приходить понимание ее применимости. Можно давать советы «всегда думать головой» и «писать код без ошибок», но они бесполезны.

Добавлено через 9 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
И связей между целыми объектами даже в суперкривом проекте меньше, чем в не ООП проекте на аналогичную тему скалярных переменных, которые могут потеряться.
Речь не про суперкривые проекты, а про большие проекты. В больших проектах одних типов несравнимо больше, чем можно держать в голове, и конечно, про отдельные переменные речи даже не идет. Высокая связность — единственная проблема, для решения которой вообще придуманы все механизмы ограничения доступа, пространств имен и методик рефакторинга. Для чего бы еще они были нужны, если вы и так пишите все там, где надо?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.04.2013, 20:18
Нельзя даже подумать о строке, не вспомнив, что она состоит из символов. Нельзя подумать об автомобиле и забыть, что двигатель - его часть. И если он у вас валяется отдельно - это плохо. Так же плохо, если цилиндры связаны сразу с булыжниками. А если спрятаны глубоко в двигатель и непосредственно не доступны - хорошо. Потому что снаружи они не нужны. В public вообще уместно выносить только интерфейсы, если член класса - как раз часть интерфейса - выноси в палбоик, не стесняйся. Только зулус способен помыслить о телевизоре, забыв об интерфейсе выбора каналов. Причём, если он в поте лица своего этот интерфейс выбрал, а тем более с ноля придумал, то ещё и во всех подробностях его. Но очень плохо, если телевизор валяется в цилиндре двигателя, как не выкручивайся с пабликом, а такое будет быстро забыто. Весь телевизор лучше или в глобал, или в склад телевизоров. Ну в крайнем случае в склад бытовой техники вообще. Опять таки будет трудно забыть, из чего он состоит. Не возможно забыть, что печь имеет футеровку, а электропечь электроды. Не возможно забыть, что электроприбор имеет такие свойства, как напряжение питания, потребляемый ток, вид тока, а если ток переменный. то ещё и количество фаз и частоту. И от размеров иерархии объектов принципиально ничего не меняется, если структура стройна, забыть её сложно. А рекомендация прятать объект в максимально закрытую область, выполняемая без критического анализа, как раз и выльется в телевизор внутри клапана. И в избыток связей и интерфейсов.

Добавлено через 3 минуты
Цитата Сообщение от shuffle Посмотреть сообщение
Высокая связность — единственная проблема, для решения которой вообще придуманы все механизмы ограничения доступа, пространств имен и методик рефакторинга. Для чего бы еще они были нужны, если вы и так пишите все там, где надо?
Там где надо - это как раз без лишних связей вообще, каждая связь должна быть необходима проекту. Именно это, а не суперпамять, обеспечивает надёжное запоминание связей. В большом, но хорошо продуманном проекте, связей меньше, чем в кривом и не только такого же размера, но часто и меньшего.

Добавлено через 5 минут
А сколько там всего типов - не принципиально. Я свободно ориентируюсь в паре миллионов хорошо связанных строк, но "утону" в пяти криво нагромождённых переменных двух скалярных типов, когда быдлокод и экран то целиком не занимает.
0
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 12
Регистрация: 16.08.2011
Сообщений: 249
18.04.2013, 21:16
Цитата Сообщение от taras atavin Посмотреть сообщение
В public вообще уместно выносить только интерфейсы, если член класса - как раз часть интерфейса - выноси в палбоик, не стесняйся
Из своего опыта - если член класса интерфейс - то для него всегда делаю геттеры и сеттеры. Причина проста - доступ к переменным часто может потребовать проверку или какие-либо другие действия. Одно дело если тупо приравниваешь, а другое дело если вызываешь функцию. Если класс геттеры и сеттеры написаны правильно, то переживать не стоит, а если нет - то придется на всякий случай, или в случая появления краха системы, заглядывать внутрь класса. Поэтому переменные лучше инкапсулировать, а наверх выдавать только публичные функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2013, 21:16

Преобразования объектов классов в объекты других классов
Задача типа обмен валют. Нужно конвертировать старый фунт стерлинг(фунт, шиллинг и пенсы) в доллары и обратно, по курсу 1 фунт = 50...

Как создавать в цикле разные объекты одной структуры?
Допустим есть структура которая представляет из себя ячейку которая хранит данные по координатам X Y Z и некоторые свойства этой ячейки. ...

При выделении памяти через malloc, как создавать объекты ?
Выделяю память через malloc под 4 объекта, как их создать ? myClass * ptr = (myClass*) malloc(sizeof(myClass)*4); for(int i = 0;...

Объекты классов в динамической памяти
Я создаю объект класса в динамической памяти ( например map *obj = new map; ) Вопрос: как сделать трехмерый(или хотя бы двумерный) массив...

Объекты различных классов в списке
В списке выводится только последний объект. Подскажите в чем ошибка. #include <iostream> #include <iomanip> #include...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru