Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194

Никогда не использовать конструктор с параметрами?

05.03.2013, 10:52. Показов 2897. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если я захочу чтоб в одном классе был вложен другой класс

Не по теме:

например есть класс "бумажник"
а класс "человек" среди своих данных содержит экземпляр класса "бумажник"


То обнаружу что я не могу передать его конструктору параметры.
а могу лишь написать:
C++
1
2
3
4
5
6
class c_Chelovek {
 
public:
    c_Chelovek();
    c_Bumaznik bumaznik;
}
При этом вызовется именно конструктор c_Bumaznik() без параметров.

Если же я захочу написать функцию типа c_Chelovek::AddBumaznik(int dengi);
и в ней вызвать конструктор бумажника с параметрами - то ничего ни выходит.
Типа обьект уже создан.

Отсюда делаю далеко идущие выводы.
Вот пишу я класс. Возможно когда то я или кто то захочет использовать его экземпляр внутри своего класса.
тогда у меня один правильный выход:
-писать конструктор без параметров
-писать функцию класса Init(params); //Функцию инициализации класса с параметрами

Я чтото упустил из виду?

Добавлено через 12 минут
Или же так не делают. А надо по хитрому.
- заводить переменную - указатель на обьект "бумажник"
- в функции c_Chelovek::AddBumaznik(int dengi) выделять оператором new новый экземпляр класса "бумажник"
при этом ему можно сообщать параметры конструктора
и в переменную(указатель) писать адресс вновь созданого обьекта
и с ним потом както работать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2013, 10:52
Ответы с готовыми решениями:

Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор
Создать класс «матрица». Данный класс должен содержать элементы типа int, определяющие число строк, столбцов и состояние ошибки. Определить...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Конструктор с параметрами И конструктор по умолчанию. Как?
Опять прошу совета. Выполняю тут из интернета задания. Класс надо создать, там будут конструкторы и с пар. и без аргументов. И вот не...

31
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.03.2013, 12:55
Студворк — интернет-сервис помощи студентам
nefton, Ну во-первых если и хранить в классе человека какие-то объекты, то либо быть уверенным, что человек обязан обладать этими объектами, либо хранить указатели. Либо хранить указатель/ссылку на человека в конкретном типе. Либо построить взаимодействие несколько по-другому, например через id-шники, а связь устроить через БД.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.03.2013, 12:56
Не несите ерунды. Ваша задача сделать класс бумажник, этим и занимайтесь. Делайте его интерфейс максимально эффективным. А то, как Ваш класс будет использоваться Вас никак не должно касаться. Вы сделали свой кирпич(класс) и он будет использован при строительстве дома(программы). А в каком месте он будет и каким боком, Вас касаться не должно.
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:00
Цитата Сообщение от nefton Посмотреть сообщение
Вот в том то и дело. Я пишу класс "бумажник".
Судя по тому, что ты озвучиваешь, ты хочешь обеспечить повторное использование бумажника вне зависимости от контекста и задачи однажды кем-либо. НО. Ты никогда не напишешь абсолютно универсальный класс, который подошел бы всем. Да это и не требуется, см. "минимальность и полнота" интерфейса класса (Мейерс, например).

Далее. Если однажды бумажник не удовлетворит запросу - есть наследование и агрегация, как механизмы повторного использования кода при создании новых классов, закрытое наследования, наконец.

Цитата Сообщение от nefton Посмотреть сообщение
вся проблема в том что для меня как обычного человека естественнее использовать в программе бумажник, а не указатель на него
А в начальной задумке ты сконструировал человека, который физически состоит из бумажника и еще чего-то - тоже не похоже на правду. Указатель поможет тебе определить модель не "состоит из", а реализует концепцию "использования". Есть внешний бумажник, есть человек, есть связь и связь - динамическая.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
05.03.2013, 13:04  [ТС]
Та я уже понял что самое лучшее из возможных вариантов - работать с указателями на обьекты.
и не придумывать как обойти это типа функции Init() или тем более цвет по умолчанию
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:06
nefton, Сорри, я уже, наверное, обсужденные вещи накатал. (прост с английского на рабочее место вернулся и не увидел, что тут уже 3 страницы, ответил на первые сообщения)
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
05.03.2013, 13:15
Цитата Сообщение от nefton Посмотреть сообщение
разве? спроси у прохожего какой цвет его бумажника по умолчанию
Да и во что превратится конструктор человека если у него не только бумажник, а и блокнот, портфель, карманы, и ещё пол сотни обьектов
Стоп! Ты конструируешь класс Бумажник. Поэтому тебя должны волновать только его правильная работа и непротиворечивость. Уж как там будет совершенно посторонний Человек использовать твой Бумажник - не твоя забота. И при конструировании Бумажника тебя не должны волновать Блокнот, Портфель и прочие объекты, - пусть их будет хоть миллион. Об их хранении и взаимодействии пусть думает тот, кто будет разрабатывать Человека. (The Lord? :-) )

Короче, тут у тебя "смешались в кучу кони, люди...." А надо - разделяй и властвуй!
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:17
По-хорошему, так вообще можно декларировать человека как френд для бумажника, чтобы тот проверял состояние его самостоятельно. Потому как бумажник - лишь обертка для хранения денег/карт и едва ли объект класса бумажник должен отвечать на запрос кол-ва денег. Это больше походит на реальное поведение, но делает класс бумажника не особо универсальным, потому как теперь работать с ним может лишь человек. И, к тому же эта идея может разбудить воинственных крестоносцев, неприемлющих использование friend-классов
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
05.03.2013, 13:18  [ТС]
п.с. и вовсе это не противоестественно иметь обьект его не инициализируя.
чего ж вы не возмущаетесь противоестественности записи
int i;
//some code
i=5;
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:19
Цитата Сообщение от CheshireCat Посмотреть сообщение
А надо - разделяй и властвуй!
Только вот грамотное разделение - никогда не будет лучшим и универсальным для любой модели, поэтому it depends.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
05.03.2013, 13:27
Цитата Сообщение от nefton Посмотреть сообщение
и вовсе это не противоестественно иметь обьект его не инициализируя.
чего ж вы не возмущаетесь противоестественности записи
int i;
//some code
i=5;
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
int main()
{
    int i;
    cout << i << endl;
    i = 5;
}
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
05.03.2013, 13:30  [ТС]
CheshireCat, ну вот я ж и говорю что это нормально, и компилятор считает что это нормально.
а вот если i это обьект - то компилятор уже считает по другому, что не нормально иметь чтото в памяти без начальной инициализации.
хотя в книжках говорят что класс - это как бы такой тип данных.
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:36
Цитата Сообщение от nefton Посмотреть сообщение
п.с. и вовсе это не противоестественно иметь обьект его не инициализируя.
чего ж вы не возмущаетесь противоестественности записи
int i;
//some code
i=5;
Да, пусть ты создал объект и он неинициализирован. НО:
во-первых, он может быть использован в таком виде - и будет тебе undefined behaviour (кстати, по-моему, этот термин потрясающе популярен и излюблен всеми))))
Во-вторых, твой кошелёк, находит ли (в случае его неинициализированности) отражение в реальном мире? Нет. его однажды создали и все. Его физические свойства - его инвариант к контексте пользования им, если ты, конечно, не предусматриваешь функцию типа tear up для человека) (для физических издевательств над кошельком многострадальным)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2013, 13:36

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Конструктор с параметрами
Доброе время суток! Суть вопроса вот в чем: Есть класс Game, в котором создаю объект с параметрами. Параметры я пытаюсь передать...

Конструктор (с параметрами)
public Osob (Osob o1, Osob o2){ int crossPoint = (int)(Math.random() * 10); for (int i = 0; i &lt; D; i++){ ...

Конструктор с параметрами
Забыл как выводить конструктор с параметрами, пробую так не выходит. #include &lt;iostream&gt; using namespace std; class...

Конструктор с параметрами
Вот пример структуры моей программы. class Entity { protected: int id; public: Entity(); Entity(Entity*); };


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru