Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2011, 15:51
Ответы с готовыми решениями:

Возможно ли создать объект своего класса, который состоит из объектов другого класса?
Возможно ли создать объект своего класса, который состоит из объектов другого класса, например: ...

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего...

Как из одного объекта получить объект другого класса?
Форумчане, подскажите. У меня есть два класса: class Category{ private $id = ''; private...

19
31 / 31 / 3
Регистрация: 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
85 / 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
31 / 31 / 3
Регистрация: 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
85 / 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
Заблокирован
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
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 16:46  [ТС] 7
Bers, веселый хак я бы не додумался сразу
0
Заблокирован
19.12.2011, 16:49 8
Цитата Сообщение от res Посмотреть сообщение
Bers, веселый хак я бы не додумался сразу
Все по стандарту.

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

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

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

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

C++
1
2
3
4
5
6
class Worker
{
    vector<Worker> vWorkers(50); // нельзя
             //но в списках инициализации, или в самом теле
             // конструктора класса - можно.
...
0
85 / 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; 
...
как верно заранее инициализировать именно там, где я показал?
0
Заблокирован
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; 
...
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:35  [ТС] 18
Bers, ладно забей, правильно задавать вопросы я не умею.
0
Заблокирован
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; 
...
0
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
19.12.2011, 17:59  [ТС] 20
Bers, нет не так, далековато ты ушёл.
В прочем, ты здесь мне уже помог
0
19.12.2011, 17:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2011, 17:59
Помогаю со студенческими работами здесь

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

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или как то обойти эту...

Создать обЪект класса , у которого в параметрах конструктора объект этого же класса
Вот код: TOgmGraphicsClass = class of TOgmGraphicsBlock; TOgmGraphicsBlock =...

Ошибка при попытке использовать объект класса в определении другого класса
Муторное название получилось :scratch: Прошу помощи.... есть созданный класс работы со строкой:...

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

Использование в качестве поля класса указатель на объект другого класса
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru