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

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

Войти
Регистрация
Восстановить пароль
 
 
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 190
#1

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

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

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

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

Конструктор с параметрами - C++
Не получается конструктор с параметром.. помогите пожалуйста! вот весь класс, нужно чтобы можно было в main писать вот так например: ...

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

Конструктор с параметрами - C++
Забыл как выводить конструктор с параметрами, пробую так не выходит. #include <iostream> using namespace std; class Thread{ ...

Не отображается конструктор с параметрами - C++
// рншр.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> class compyter ...

31
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 190
05.03.2013, 12:44  [ТС] #16
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
#include <iostream>
using namespace std;
 
class bumaznik {
public:
    bumaznik(int color){bumaznik::color=color;};
    int GetColor(){return color;};
    int color;
};
class chelovek {
public:
    chelovek(int rost){chelovek::rost=rost;};
    void MakeBumaznik(int color);
    bumaznik my_bumaznik;
    int rost;
};
 
void chelovek::MakeBumaznik(int color){
    my_bumaznik=bumaznik(color);
}
 
 
 
void main(){
 
    chelovek Vasiliy(180);
    Vasiliy.MakeBumaznik(5);
 
    cout<<Vasiliy.my_bumaznik.GetColor();
 
    int g;
    cin>>g;
 
}
Некатит пишет ошибка
error C2512: 'bumaznik' : no appropriate default constructor available
0
Kuzia domovenok
2127 / 1957 / 196
Регистрация: 25.03.2012
Сообщений: 6,808
Записей в блоге: 1
05.03.2013, 12:47 #17
Цитата Сообщение от nefton Посмотреть сообщение
chelovek(int rost){chelovek::rost=rost;};
C++
1
chelovek(int rost): my_bumaznik(0){chelovek::rost=rost;}
0
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 190
05.03.2013, 12:47  [ТС] #18
Цитата Сообщение от CheshireCat Посмотреть сообщение
// бумажник должен иметь какой-то цвет по умолчанию:
* * Human(int growth, int weight): w(0) {};
разве? спроси у прохожего какой цвет его бумажника по умолчанию

Да и во что превратится конструктор человека если у него не только бумажник, а и блокнот, портфель, карманы, и ещё пол сотни обьектов
0
Kuzia domovenok
2127 / 1957 / 196
Регистрация: 25.03.2012
Сообщений: 6,808
Записей в блоге: 1
05.03.2013, 12:51 #19
Цитата Сообщение от nefton Посмотреть сообщение
разве? спроси у прохожего какой цвет его бумажника по умолчанию
бред. Просто скажи, что ты хочешь от человека? Чтобы он принимал в своём конструкторе цвет бумажника или, чтобы его бумажник по умолчанию имел color=0 ???
Третьего не дано. Всё потому, что его бумажник всегда создаётся одновременно с человеком.
Ты не можешь создать бумажник без цвета. + бумажник создаётся в процессе создания человека = ты обязан определиться с цветом в процессе создания человека
И тем самым, кстати, С++ оберегает тебя от ошибок.
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.03.2013, 12:55 #20
nefton, Ну во-первых если и хранить в классе человека какие-то объекты, то либо быть уверенным, что человек обязан обладать этими объектами, либо хранить указатели. Либо хранить указатель/ссылку на человека в конкретном типе. Либо построить взаимодействие несколько по-другому, например через id-шники, а связь устроить через БД.
0
Kuzia domovenok
2127 / 1957 / 196
Регистрация: 25.03.2012
Сообщений: 6,808
Записей в блоге: 1
05.03.2013, 12:55 #21
Цитата Сообщение от nefton Посмотреть сообщение
Да и во что превратится конструктор человека если у него не только бумажник, а и блокнот, портфель, карманы, и ещё пол сотни обьектов
а зачем их хранить в человеке по значению??? Храни тогда указатели на них. Ты изначально спрашивал о классе "человек" с полем "бумажник"
0
Croessmah
Ушел
13768 / 8018 / 924
Регистрация: 27.09.2012
Сообщений: 19,740
Записей в блоге: 3
Завершенные тесты: 1
05.03.2013, 12:56 #22
Не несите ерунды. Ваша задача сделать класс бумажник, этим и занимайтесь. Делайте его интерфейс максимально эффективным. А то, как Ваш класс будет использоваться Вас никак не должно касаться. Вы сделали свой кирпич(класс) и он будет использован при строительстве дома(программы). А в каком месте он будет и каким боком, Вас касаться не должно.
0
ITcrusader
Эксперт С++
177 / 163 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:00 #23
Цитата Сообщение от nefton Посмотреть сообщение
Вот в том то и дело. Я пишу класс "бумажник".
Судя по тому, что ты озвучиваешь, ты хочешь обеспечить повторное использование бумажника вне зависимости от контекста и задачи однажды кем-либо. НО. Ты никогда не напишешь абсолютно универсальный класс, который подошел бы всем. Да это и не требуется, см. "минимальность и полнота" интерфейса класса (Мейерс, например).

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

Цитата Сообщение от nefton Посмотреть сообщение
вся проблема в том что для меня как обычного человека естественнее использовать в программе бумажник, а не указатель на него
А в начальной задумке ты сконструировал человека, который физически состоит из бумажника и еще чего-то - тоже не похоже на правду. Указатель поможет тебе определить модель не "состоит из", а реализует концепцию "использования". Есть внешний бумажник, есть человек, есть связь и связь - динамическая.
0
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 190
05.03.2013, 13:04  [ТС] #24
Та я уже понял что самое лучшее из возможных вариантов - работать с указателями на обьекты.
и не придумывать как обойти это типа функции Init() или тем более цвет по умолчанию
0
ITcrusader
Эксперт С++
177 / 163 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:06 #25
nefton, Сорри, я уже, наверное, обсужденные вещи накатал. (прост с английского на рабочее место вернулся и не увидел, что тут уже 3 страницы, ответил на первые сообщения)
0
CheshireCat
Эксперт С++
2903 / 1252 / 81
Регистрация: 27.05.2008
Сообщений: 3,437
05.03.2013, 13:15 #26
Цитата Сообщение от nefton Посмотреть сообщение
разве? спроси у прохожего какой цвет его бумажника по умолчанию
Да и во что превратится конструктор человека если у него не только бумажник, а и блокнот, портфель, карманы, и ещё пол сотни обьектов
Стоп! Ты конструируешь класс Бумажник. Поэтому тебя должны волновать только его правильная работа и непротиворечивость. Уж как там будет совершенно посторонний Человек использовать твой Бумажник - не твоя забота. И при конструировании Бумажника тебя не должны волновать Блокнот, Портфель и прочие объекты, - пусть их будет хоть миллион. Об их хранении и взаимодействии пусть думает тот, кто будет разрабатывать Человека. (The Lord? :-) )

Короче, тут у тебя "смешались в кучу кони, люди...." А надо - разделяй и властвуй!
0
ITcrusader
Эксперт С++
177 / 163 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:17 #27
По-хорошему, так вообще можно декларировать человека как френд для бумажника, чтобы тот проверял состояние его самостоятельно. Потому как бумажник - лишь обертка для хранения денег/карт и едва ли объект класса бумажник должен отвечать на запрос кол-ва денег. Это больше походит на реальное поведение, но делает класс бумажника не особо универсальным, потому как теперь работать с ним может лишь человек. И, к тому же эта идея может разбудить воинственных крестоносцев, неприемлющих использование friend-классов
0
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 190
05.03.2013, 13:18  [ТС] #28
п.с. и вовсе это не противоестественно иметь обьект его не инициализируя.
чего ж вы не возмущаетесь противоестественности записи
int i;
//some code
i=5;
0
ITcrusader
Эксперт С++
177 / 163 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:19 #29
Цитата Сообщение от CheshireCat Посмотреть сообщение
А надо - разделяй и властвуй!
Только вот грамотное разделение - никогда не будет лучшим и универсальным для любой модели, поэтому it depends.
0
CheshireCat
Эксперт С++
2903 / 1252 / 81
Регистрация: 27.05.2008
Сообщений: 3,437
05.03.2013, 13:27 #30
Цитата Сообщение от 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 13:27
Привет! Вот еще темы с ответами:

Конструктор с параметрами по умолчанию - C++
пытаюсь создать класс с параметрами по умолчанию(я да, надеюсь, что я не путаюсь в терминах) #include &lt;iostream&gt; class some { ...

Классы и конструктор по умолчанию/с параметрами - C++
Помогите пожалуйста! Необходимо сконструировать класс с заданным набором свойств. В данном случае, касс содержит следующие поля: продукт,...

Как сделать конструктор и деструктор с параметрами? - C++
как сделать конструктор и деструктор с параметрами?:-| #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class...

Прблемы с Шаблонами: Конструктор с параметрами, объявление итератора. - C++
Добрый день. Начал изучать шаблоны и сразу же возникло 2 проблемы: 1).На Строке в мейне SArr&lt;short&gt; ar1(100); Выдается ошибка...


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

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

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