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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 15:51     Как создать объект с конструктором в интерфейсе другого класса? #1
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: Пример привел исключительно ради вопроса.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2011, 15:51     Как создать объект с конструктором в интерфейсе другого класса?
Посмотрите здесь:

как заменить объект List одного класса,объектом другого?? C++
C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
Как создать объект класса? ПРоблемма из-за раздельной компиляции C++
Как скопировать объект с удаленным копирующим конструктором? C++
C++ Как создать объект класса в динамической памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
absokolov
29 / 29 / 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
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() { тут }
absokolov
29 / 29 / 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;
    }
да не важно.
Очень даже важно!
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;
    // ...
};
а разве так безопасно? Может стоит воспользоваться умным указателем?
С умом конечно, имею в виду.
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;
 
    // ...
};
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 16:46  [ТС]     Как создать объект с конструктором в интерфейсе другого класса? #7
Bers, веселый хак я бы не додумался сразу
Bers
Заблокирован
19.12.2011, 16:49     Как создать объект с конструктором в интерфейсе другого класса? #8
Цитата Сообщение от res Посмотреть сообщение
Bers, веселый хак я бы не додумался сразу
Все по стандарту.

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

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

Цитата Сообщение от res Посмотреть сообщение
как мне внутри { } конструктора
У тебя рабочий содержит рабочую_инфу.
Теперь ты хочешь сделать вектор рабочих, и куда то воткнуть. Куда?
absokolov
29 / 29 / 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" - то он должен тоже нормально воспринять!
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:08  [ТС]     Как создать объект с конструктором в интерфейсе другого класса? #12
Теперь ты хочешь сделать вектор рабочих, и куда то воткнуть. Куда?
в интерфейс.
чего ты хочешь?
инициализировать объект внутри конструктора
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 Посмотреть сообщение
в интерфейс.
Моя не понимать! Интерфейсов в мире мноооогаааа! Куда именно? Вах вах!
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); // нельзя
...
Bers
Заблокирован
19.12.2011, 17:18     Как создать объект с конструктором в интерфейсе другого класса? #15
res, То есть, ты хочешь, что бы у тебя объект внутри себя хранил объекты самого себя?

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

C++
1
2
3
4
5
6
class Worker
{
    vector<Worker> vWorkers(50); // нельзя
             //но в списках инициализации, или в самом теле
             // конструктора класса - можно.
...
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:24  [ТС]     Как создать объект с конструктором в интерфейсе другого класса? #16
Bers, ну это я пример только привёл, тогда сделаем так
C++
1
2
3
4
class Worker
{
    vector<string> vNames(50); // нельзя
...
Вот теперь суть темы:
как правило, в интерфейсе объект инициализировать нельзя, но можно в конструкторе.
C++
1
2
3
4
5
6
7
8
9
class Worker
{
    Worker() 
    { 
        vNames(50); // не верно
        vNames.resize(50); // можно, но не так хотелось бы
    } 
    vector<string> vNames; 
...
как верно заранее инициализировать именно там, где я показал?
Bers
Заблокирован
19.12.2011, 17:29     Как создать объект с конструктором в интерфейсе другого класса? #17
можно так:
C++
1
2
3
4
5
class Worker
{
    Worker() { vNames.resize(50); } 
    vector<string> vNames; 
...
можно так:
C++
1
2
3
4
5
class Worker
{
    Worker() { vNames.resize(50, "Здравствуй мир"); } 
    vector<string> vNames; 
...
можно так:

C++
1
2
3
4
5
class Worker
{
    Worker():vNames(50) {} 
    vector<string> vNames; 
...
а можно так:


C++
1
2
3
4
5
class Worker
{
    Worker():vNames(50, "Здравствуй мир!") {} 
    vector<string> vNames; 
...
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:35  [ТС]     Как создать объект с конструктором в интерфейсе другого класса? #18
Bers, ладно забей, правильно задавать вопросы я не умею.
Bers
Заблокирован
19.12.2011, 17:53     Как создать объект с конструктором в интерфейсе другого класса? #19
может быть ты хотел вот так:

C++
1
2
3
4
5
6
7
8
9
10
class Worker
{
    Worker( const int howMany, const std::string& val) 
    { 
        
        vNames.resize(howMany, val); //получим данные от  конструктора
                                   //и протолкнем их дальше - в данный-член
    } 
    vector<string> vNames; 
...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 17:59     Как создать объект с конструктором в интерфейсе другого класса?
Еще ссылки по теме:

C++ Создать объект внутри класса, который может вызывать функцию этого класса
C++ Передача указателя в класс на объект другого класса
Как создать объект класса в потоке? C++

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

Или воспользуйтесь поиском по форуму:
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:59  [ТС]     Как создать объект с конструктором в интерфейсе другого класса? #20
Bers, нет не так, далековато ты ушёл.
В прочем, ты здесь мне уже помог
Yandex
Объявления
19.12.2011, 17:59     Как создать объект с конструктором в интерфейсе другого класса?
Ответ Создать тему
Опции темы

Текущее время: 02:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru