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

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

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

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

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

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

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

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

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

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

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

Как вызвать конструктор с параметрами в конструкторе без параметров? - C++
Как вызвать конструктор с параметрами в конструкторе без параметров? То есть что бы конструктор с параметрами выступал в роли основного. В...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 188
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
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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;}
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 188
05.03.2013, 12:47  [ТС]     Никогда не использовать конструктор с параметрами? #18
Цитата Сообщение от CheshireCat Посмотреть сообщение
// бумажник должен иметь какой-то цвет по умолчанию:
* * Human(int growth, int weight): w(0) {};
разве? спроси у прохожего какой цвет его бумажника по умолчанию

Да и во что превратится конструктор человека если у него не только бумажник, а и блокнот, портфель, карманы, и ещё пол сотни обьектов
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
05.03.2013, 12:51     Никогда не использовать конструктор с параметрами? #19
Цитата Сообщение от nefton Посмотреть сообщение
разве? спроси у прохожего какой цвет его бумажника по умолчанию
бред. Просто скажи, что ты хочешь от человека? Чтобы он принимал в своём конструкторе цвет бумажника или, чтобы его бумажник по умолчанию имел color=0 ???
Третьего не дано. Всё потому, что его бумажник всегда создаётся одновременно с человеком.
Ты не можешь создать бумажник без цвета. + бумажник создаётся в процессе создания человека = ты обязан определиться с цветом в процессе создания человека
И тем самым, кстати, С++ оберегает тебя от ошибок.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.03.2013, 12:55     Никогда не использовать конструктор с параметрами? #20
nefton, Ну во-первых если и хранить в классе человека какие-то объекты, то либо быть уверенным, что человек обязан обладать этими объектами, либо хранить указатели. Либо хранить указатель/ссылку на человека в конкретном типе. Либо построить взаимодействие несколько по-другому, например через id-шники, а связь устроить через БД.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
05.03.2013, 12:55     Никогда не использовать конструктор с параметрами? #21
Цитата Сообщение от nefton Посмотреть сообщение
Да и во что превратится конструктор человека если у него не только бумажник, а и блокнот, портфель, карманы, и ещё пол сотни обьектов
а зачем их хранить в человеке по значению??? Храни тогда указатели на них. Ты изначально спрашивал о классе "человек" с полем "бумажник"
Croessmah
Модератор
Эксперт CЭксперт С++
13056 / 7319 / 816
Регистрация: 27.09.2012
Сообщений: 18,055
Записей в блоге: 3
Завершенные тесты: 1
05.03.2013, 12:56     Никогда не использовать конструктор с параметрами? #22
Не несите ерунды. Ваша задача сделать класс бумажник, этим и занимайтесь. Делайте его интерфейс максимально эффективным. А то, как Ваш класс будет использоваться Вас никак не должно касаться. Вы сделали свой кирпич(класс) и он будет использован при строительстве дома(программы). А в каком месте он будет и каким боком, Вас касаться не должно.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:00     Никогда не использовать конструктор с параметрами? #23
Цитата Сообщение от nefton Посмотреть сообщение
Вот в том то и дело. Я пишу класс "бумажник".
Судя по тому, что ты озвучиваешь, ты хочешь обеспечить повторное использование бумажника вне зависимости от контекста и задачи однажды кем-либо. НО. Ты никогда не напишешь абсолютно универсальный класс, который подошел бы всем. Да это и не требуется, см. "минимальность и полнота" интерфейса класса (Мейерс, например).

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

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

Короче, тут у тебя "смешались в кучу кони, люди...." А надо - разделяй и властвуй!
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:17     Никогда не использовать конструктор с параметрами? #27
По-хорошему, так вообще можно декларировать человека как френд для бумажника, чтобы тот проверял состояние его самостоятельно. Потому как бумажник - лишь обертка для хранения денег/карт и едва ли объект класса бумажник должен отвечать на запрос кол-ва денег. Это больше походит на реальное поведение, но делает класс бумажника не особо универсальным, потому как теперь работать с ним может лишь человек. И, к тому же эта идея может разбудить воинственных крестоносцев, неприемлющих использование friend-классов
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 188
05.03.2013, 13:18  [ТС]     Никогда не использовать конструктор с параметрами? #28
п.с. и вовсе это не противоестественно иметь обьект его не инициализируя.
чего ж вы не возмущаетесь противоестественности записи
int i;
//some code
i=5;
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
05.03.2013, 13:19     Никогда не использовать конструктор с параметрами? #29
Цитата Сообщение от CheshireCat Посмотреть сообщение
А надо - разделяй и властвуй!
Только вот грамотное разделение - никогда не будет лучшим и универсальным для любой модели, поэтому it depends.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2013, 13:27     Никогда не использовать конструктор с параметрами?
Еще ссылки по теме:

Как реализовать конструктор с параметрами для инициализации полей класса? - C++
Подскажите как реализовать конструктор с параметрами для инициализации полей класса.

Класс Rational, определить стандарт. конструктор, с параметрами, опер. вычитания - C++
Разработайте и протестируйте класс Rational, представляющий рациональное число (простую дробь) в виде пары целых чисел: числитель и...

Как использовать явный конструктор родительского класса? - C++
Привет :) Вот код, строчка 43. Как использовать конструктор типа A(int), в классе C? Компилятор выдаёт ошибку (Error:...

Класс и конструктор с string или как использовать указатели. - C++
Есть такая вот ерунда class human { public: string name; string surname; int age; human(string *imya, string *familia,...

В каком месте использовать конструктор - вне цикла или в цикле? - C++
Добрый день! Как писать правильнее? Ниже два примера: QStringList data; foreach(const QString &amp;category, categories) { data...


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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,364
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;
}
Yandex
Объявления
05.03.2013, 13:27     Никогда не использовать конструктор с параметрами?
Ответ Создать тему
Опции темы

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