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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
#1

Как создать объект с конструктором в интерфейсе другого класса? - C++

19.12.2011, 15:51. Просмотров 1648. Ответов 19
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct WorkerInfo
{
    WorkerInfo(int iPay, int iDebt) : pay (iPay), iDebt(debt) {}
    ~WorkerInfo() {}
    int pay; // зарплата
    int debt; // долг
};
 
class Worker
{
    Worker()
    { 
       // как указать конструктор для workerInfo?
       workerInfo(0, 0); // не верно
    }
    WorkerInfo workerInfo;
 
    // ...
};
p.s: Пример привел исключительно ради вопроса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2011, 15:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать объект с конструктором в интерфейсе другого класса? (C++):

Как заменить объект List одного класса объектом другого? - C++
к примеру дано нам 1 объект класса Book , я хочу его вставить в класс Table вместо удаленного объекта данного класса....как мне поступить?...

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - "указателЯ" Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

Ошибка компиляции (преобразование объекта класса в объект другого класса) - C++
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

Как создать объект класса в потоке? - C++
Как создать объект класса в потоке? Это вообще возможно?

Как создать объект класса в динамической памяти? - C++
привет. я так понял, можно создать объект в динамической области памяти. либо просто создать объект обычным способом, но чтобы его...

Как создать объект класса с двумя параметрами? - C++
#include <iostream> using namespace std; class rational{ public: rational(int numerator = 0, int denominator =...

19
absokolov
30 / 30 / 1
Регистрация: 10.05.2011
Сообщений: 120
19.12.2011, 15:56 #2
Попробуйте вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct WorkerInfo
{
    WorkerInfo(int iPay, int iDebt) : pay (iPay), iDebt(debt) {}
    ~WorkerInfo() {}
    int pay; // зарплата
    int debt; // долг
};
 
class Worker
{
    Worker(): workerInfo(0, 0)
    { 
    }
    WorkerInfo workerInfo;
 
    // ...
};
Добавлено через 1 минуту
И вот тут:
C++
1
WorkerInfo(int iPay, int iDebt) : pay (iPay), iDebt(debt) {}
Поменяйте местами iDebt и debt
1
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 16:10  [ТС] #3
Цитата Сообщение от absokolov Посмотреть сообщение
Поменяйте местами iDebt и debt
да не важно.
Цитата Сообщение от absokolov Посмотреть сообщение
Worker(): workerInfo(0, 0)
Такой метод работает, но есть один нюанс. Я объекты инциализирую старым способом только если конструктор имеет методы. Например: Worker(int id) : itsId(id).
А другие объекты инициализирую внутри самого конструктора, то есть в Worker() { SetMoney(0); }.

Короче говоря, мне нужно workerInfo определить внутри конструктора Worker() { тут }
0
absokolov
30 / 30 / 1
Регистрация: 10.05.2011
Сообщений: 120
19.12.2011, 16:16 #4
Дело в том, что все переменные-члены класса создаются на этапе "constructor(): "! Так что раз уж такая ситуация, то Вам проще будет работать с указателем!

C++
1
2
3
4
5
6
7
8
9
10
class Worker
{
    Worker(): workerInfo(0)
    { 
        workerInfo = new WorkerInfo( тут параметры для конструктора );
    }
    WorkerInfo * workerInfo;
 
    // ...
};
Ну и деструктор:

C++
1
2
3
4
5
~Worker()
    { 
        if (workerInfo != 0)
            delete workerInfo;
    }
да не важно.
Очень даже важно!
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 16:22  [ТС] #5
Цитата Сообщение от absokolov Посмотреть сообщение
Очень даже важно!
Ну вы поняли
Цитата Сообщение от res Посмотреть сообщение
Пример привел исключительно ради вопроса. [/SIZE]
Добавлено через 3 минуты
absokolov,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Worker
{
    Worker()
    { 
        workerInfo = new WorkerInfo( тут параметры для конструктора );
    }
    ~Worker()
    { 
        if (workerInfo != 0)
            delete workerInfo;
    }
     WorkerInfo* workerInfo;
    // ...
};
а разве так безопасно? Может стоит воспользоваться умным указателем?
С умом конечно, имею в виду.
0
Bers
Заблокирован
19.12.2011, 16:34 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct WorkerInfo
{
    WorkerInfo(int iPay=0, int iDebt=0) : pay (iPay), debt(iDebt) {}
    ~WorkerInfo() {}
    int pay; // зарплата
    int debt; // долг
};
 
class Worker
{
   
    WorkerInfo workerInfo;
 
    // ...
};
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 16:46  [ТС] #7
Bers, веселый хак я бы не додумался сразу
0
Bers
Заблокирован
19.12.2011, 16:49 #8
Цитата Сообщение от res Посмотреть сообщение
Bers, веселый хак я бы не додумался сразу
Все по стандарту.

Единственная причина отсутствия дефолтного конструктора в классе - это явный запрет на создание объектов по дефолту.

Если нет причин для подобного запрета, дефолтный конструктор должен быть.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 16:55  [ТС] #9
Bers, ну как вы сами говорите "нарушение инкапсуляции".
А что если я добавлю объект: vector<Worker*> vWorkers;
как мне внутри { } конструктора указать размер?
Workers() { vWorkers(50); // не верно}
ну можно "vWorkers.resize(50)". Но не решение вопроса
0
Bers
Заблокирован
19.12.2011, 17:04 #10
Цитата Сообщение от res Посмотреть сообщение
Bers, ну как вы сами говорите "нарушение инкапсуляции".
А что если я добавлю объект: vector<Worker*> vWorkers;
как мне внутри { } конструктора указать размер?
Workers() { vWorkers(50); // не верно}
ну можно "vWorkers.resize(50)". Но не решение вопроса
Моя твоя не понимать! Моя не телепат, чего ты хочешь?

Цитата Сообщение от res Посмотреть сообщение
как мне внутри { } конструктора
У тебя рабочий содержит рабочую_инфу.
Теперь ты хочешь сделать вектор рабочих, и куда то воткнуть. Куда?
0
absokolov
30 / 30 / 1
Регистрация: 10.05.2011
Сообщений: 120
19.12.2011, 17:04 #11
Цитата Сообщение от res Посмотреть сообщение
Ну вы поняли


Добавлено через 3 минуты
absokolov,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Worker
{
    Worker()
    { 
        workerInfo = new WorkerInfo( тут параметры для конструктора );
    }
    ~Worker()
    { 
        if (workerInfo != 0)
            delete workerInfo;
    }
     WorkerInfo* workerInfo;
    // ...
};
а разве так безопасно? Может стоит воспользоваться умным указателем?
С умом конечно, имею в виду.
А почему же не безопасно?
Если я не ошибаюсь, то даже если передать в delete указатель со значением "0" - то он должен тоже нормально воспринять!
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:08  [ТС] #12
Теперь ты хочешь сделать вектор рабочих, и куда то воткнуть. Куда?
в интерфейс.
чего ты хочешь?
инициализировать объект внутри конструктора
0
Bers
Заблокирован
19.12.2011, 17:11 #13
*включил телепатию*

Если тебе нужно запихать в вектор некоторое количество работяг, созданных конструктором с параметрами, то это уже в компетенции самого вектора, а не работяг:
C++
1
2
3
//это псевдокод, если что. 
//Так то, хранить ссылки на локальные объект не очень хорошая идея.
vector<Worker*> vWorkers(количество_работяг, &(конструктор_работяги));
ну или так:
C++
1
vector<Worker> vWorkers(10,work());//вектор будит хранить 10х рабочих
или так:


C++
1
2
3
//вектор будит хранить 10х рабочих созданных 
//конструктором с параметрами
vector<Worker> vWorkers(10,work(10,10));
или так:

C++
1
2
3
4
5
vector<Worker*> vpWorkers(10);//создадим 10 штук мест под указатели
for(uint i=0; i< vpWorkers.size(); ++i)
{
     vpWorkers[i].Запихать( new Worker()  ); //запихиваем указатели
}

и тд и тп

Добавлено через 58 секунд
Цитата Сообщение от res Посмотреть сообщение
в интерфейс.
Моя не понимать! Интерфейсов в мире мноооогаааа! Куда именно? Вах вах!
1
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:14  [ТС] #14
absokolov, я в динамической памяти плохо разбираюсь, детально не читал, архитектуру ЭВМ не учил. Поэтому, самостоятельно выделять и работать с динамической памятью особого желания нет.

Добавлено через 1 минуту
Bers,
вот что я имею в виду
C++
1
2
3
4
class Worker
{
    vector<Worker> vWorkers(50); // нельзя
...
0
Bers
Заблокирован
19.12.2011, 17:18 #15
res, То есть, ты хочешь, что бы у тебя объект внутри себя хранил объекты самого себя?

Ты уверен, что это именно то, что тебе нужно?

C++
1
2
3
4
5
6
class Worker
{
    vector<Worker> vWorkers(50); // нельзя
             //но в списках инициализации, или в самом теле
             // конструктора класса - можно.
...
0
19.12.2011, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 17:18
Привет! Вот еще темы с ответами:

Как скопировать объект с удаленным копирующим конструктором? - C++
Здравствуйте. Я использую SFML и делаю биндинги к Lua на основе luabind. Суть такова: в скрипте lua делается инстанс класса sf::Window. Над...

Как создать объект класса? ПРоблемма из-за раздельной компиляции - C++
Есть 4 файла engine.h - базовый класс engine.cpp - реализация методов базового класса car.h - класс поизводный от engine car.cpp -...

Передача указателя в класс на объект другого класса - C++
Не могу передать ссылку на объект класса в другой класс main.cpp #include &lt;iostream&gt; #include &quot;test\class_a.h&quot; #include...

Как создать класс, который содержит элементы другого класса - C++
Добрый день, я чисто любитель, начала сама потихоньку разбираться в с++, благополучно дошла до классов и сделала класс konto (банковский...


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

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

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