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

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

Войти
Регистрация
Восстановить пароль
 
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
#1

Конструктор и Деструктор (инициализация массивов) - C++

26.03.2013, 23:50. Просмотров 698. Ответов 11
Метки нет (Все метки)

Стал вопрос по инициализации массивов (внутри класса) в конструкторе, но ни методичка, ни гугль явного ответа не дали, возможно массив символов проще преобразовать в строку?

Часть кода ко конструктора и деструктора включительно, опять же интересен вариант преобразования типа 4ар в строку, возможно актуально.

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
#include <iostream>
 
using namespace std;
 
class card
{
    public:
    char gender[45];
    char name[45];
    char k[45]="WARNING! *Pension age*";
    char t[45]="Age doesn't pension";
    long employee_id;
    int age;
    float salary;
    card(char* sex, char* fname, long id, int old, float pay)
    {
        for(int i=0;i<45;i++)
        {
            gender[i]=sex;
            name[i]=fname;
            employee_id[i]=id;
            age[i]=old;
            salary[i]=pay;
        }
    }
    ~card()
    {
 
    }
Добавлено через 5 минут
Забыл упомянуть, что в конструкторе предполагается выделение памяти, насколько это применимо к типу string?

Добавлено через 19 минут
Вот код целиком, с заменой объектов типа char* на string, теперь класс хавает, но при инициализации проблемы с вызовом из мейна:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <string>
 
using namespace std;
 
class card
{
    public:
    string gender;
    string name;
    string k="WARNING! *Pension age*";
    string t="Age doesn't pension";
    long employee_id;
    int age;
    float salary;
    card(string sex, string fname, long id, int old, float pay)
    {
            gender=sex;
            name=fname;
            employee_id=id;
            age=old;
            salary=pay;
    }
    ~card()
    {
 
    }
    string employee()
    {
        if(gender!="Female")
          return age>60? k:t;
          else
          return age>50? k:t;
    }
    void output()
    {
        cout<<endl<<"Gender of employee: "<<gender<<endl;
        cout<<"Name of employee: "<<name<<endl;
        cout<<"Personal ID: "<<employee_id<<endl;
        cout<<"Age of employee: "<<age<<endl;
        cout<<"Salary of employee: "<<salary<<endl;
    }
};
int main(void)
{
    card e;
      cout<<"Gender of employee:"<<endl;
      cin>> e.gender;
      cout<<"Name of employee:"<<endl;
      cin>> e.name;
      cout<<"Personal ID:"<<endl;
      cin>>e.employee_id;
      cout<<"Age of employee:"<<endl;
      cin>>e.age;
      cout<<"Salary of employee:"<<endl;
      cin>>e.salary;
      e.output();
      cout<<endl<<e.employee()<<endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор и Деструктор (инициализация массивов) (C++):

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Конструктор/деструктор - C++
Подскажите пожалуйста как внедрить в вот эту программу конструктор и деструктор... В программе есть базовый класс (летательные аппараты)...

Конструктор, деструктор - C++
Дорогие друзья, программисты. Помогите пожалуйста разобраться с конструктором и деструктором, а так же перегрузкой. Фотография прилагается...

конструктор и деструктор - C++
помоги пожалуйста написать программу в которой создаются и разрушаются объекты определенного пользовательского класса.Выполнить...

Конструктор и деструктор - C++
Всем привет.Вообщем передо мной стоит такая задача-Отобразить на экране время работы программы, используя конструктор и деструктор.В...

11
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2013, 12:21 #2
Цитата Сообщение от Satansoft Посмотреть сообщение
но при инициализации проблемы с вызовом из мейна:
Так у Вас конструктора по умолчанию нет. Либо создайте его, либо замените 46 строку на нечто такое:
C++
1
card e ("male", "man", 0, 0, 0.0 );
1
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
27.03.2013, 13:19  [ТС] #3
Уже понял Нужно в деструкторе удалить выделенную память, а не выходит...

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string>
 
using namespace std;
 
class card
{
    public:
    string gender;
    string name;
    string k;
    string t;
    long employee_id;
    int age;
    float salary;
    card(string sex, string fname, string WARN, string NOT, long id, int old, float pay)
    {
            gender=sex;
            name=fname;
            k=WARN;
            t=NOT;
            employee_id=id;
            age=old;
            salary=pay;
    }
    card()
    {
        string *gender=new (string);
        string *name=new (string);
        string *k=new (string);
        string *t=new (string);
        long *employee_id=new (long);
        int *age=new (int);
        float *salary=new (float);
 
    }
    ~card()
    {
        cout<<endl<<"Gender of employee: "<<gender<<endl;
        cout<<"Name of employee: "<<name<<endl;
        cout<<"Personal ID: "<<employee_id<<endl;
        cout<<"Age of employee: "<<age<<endl;
        cout<<"Salary of employee: "<<salary<<endl;
    }
    string employee()
    {
        if(gender!="Female")
          return age>60? k:t;
          else
          return age>50? k:t;
    }
};
int main(void)
{
    card e("Female", "Sew", "WARNING! *Pension age*", "Age doesn't pension", 45245, 19, 3100);
    cout<<e.employee()<<endl;
    return 0;
}
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2013, 13:26 #4
Цитата Сообщение от Satansoft Посмотреть сообщение
Уже понял Нужно в деструкторе удалить выделенную память, а не выходит...
C++
1
2
3
4
5
6
7
8
9
10
card()
    {
        string *gender=new (string);
        string *name=new (string);
        string *k=new (string);
        string *t=new (string);
        long *employee_id=new (long);
        int *age=new (int);
        float *salary=new (float);
    }
Зачем Вам указатели и выделение памяти через new? Код, который был после замены char* на string более адекватный, чем всё остальное.
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
27.03.2013, 13:31  [ТС] #5
Tulosba, я так понял первый конструктор инициализирует, а второй выделяет память, но действительно по указателям... А деструктор только выводит... Задача состоит: Конструктор - выделение памяти, Деструктор - вывод и удаление выделенной памяти...
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2013, 14:10 #6
Цитата Сообщение от Satansoft Посмотреть сообщение
первый конструктор инициализирует, а второй выделяет память,
Конструкторы должны быть равноправны. Любой конструктор должен создавать полноценный объект. Если этого не происходит, значит присутствует ошибка при проектировании.
Цитата Сообщение от Satansoft Посмотреть сообщение
Задача состоит: Конструктор - выделение памяти
Выделение памяти - это значит, что нужно вставлять new куда попало. Если в конструкторе инициализируется строка (string), то класс string сам позаботиться о выделении и высвобождении памяти под строку.
Цитата Сообщение от Satansoft Посмотреть сообщение
Деструктор - вывод и удаление выделенной памяти...
Вывод к деструктору не должен иметь никакого отношения. Если в конструкторе не было самостоятельного выделения ресурсов, то деструктор не нужен вовсе.
1
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
27.03.2013, 14:17  [ТС] #7
Формулировка задачи:
Для класса, задать конструктор (для выделения памяти, открытия файлов, задания начальных значений при необходимости) и деструктор (для освобождения памяти, закрытия файлов, печати
последних значений).

Я как-то не так понял?

Стало быть инициализации в первом конструкторе достаточно для выделения памяти?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2013, 14:26 #8
Satansoft, я вот например формулировку задачи увидел только сейчас Раньше Вы же о ней не говорили.
В классическом понимании, в деструкторе не должно быть никакого вывода, но если он там нужен по условию задачи, то ничто не мешает его реализовать.
Цитата Сообщение от Satansoft Посмотреть сообщение
Стало быть инициализации в первом конструкторе достаточно для выделения памяти?
Да. Уберите конструктор, в котором присутствуют new. В данном случае это вообще не нужно.

Однако, если по заданию от Вас требуют выделения памяти, то, вероятно, в обучающих целях не нужно использовать готовые классы типа string, а самому заморочиться созданием "велосипеда"
1
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
27.03.2013, 14:47  [ТС] #9
Tulosba, Во-первых, не ясно что подразумевается под открытием и закрытием файлов в задаче о.О Во-вторых, вопрос удаления выделенной памяти остается открытым, удаление через деструктор ессесно...
И о каком "велосипеде" речь? По заданию нужно модифицировать программу, написанную по теме "Инициализация классов", добавив констр. и дестр. с соответствующим функционалом, что я и сделал, с одним отличием: char* to string.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2013, 16:09 #10
Цитата Сообщение от Satansoft Посмотреть сообщение
По заданию нужно модифицировать программу, написанную по теме "Инициализация классов"
Где эта исходная программа?
Цитата Сообщение от Satansoft Посмотреть сообщение
И о каком "велосипеде" речь?
Создание своего типа MyString например.
0
Satansoft
8 / 8 / 1
Регистрация: 27.02.2012
Сообщений: 724
27.03.2013, 16:31  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Где эта исходная программа?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
class card
{
    public:
    char gender[8];
    char name[32];
    char k[45]="WARNING! *Pension age*";
    char t[45]="Age doesn't pension";
    long employee_id;
    int age;
    float salary;
    char* employee()
    {
        if(gender!="Female")
          return age>60? k:t;
          else
          return age>50? k:t;
    }
    void output()
    {
        cout<<endl<<"Gender of employee: "<<gender<<endl;
        cout<<"Name of employee: "<<name<<endl;
        cout<<"Personal ID: "<<employee_id<<endl;
        cout<<"Age of employee: "<<age<<endl;
        cout<<"Salary of employee: "<<salary<<endl;
    }
};
int main(void)
{
    card e;
      cout<<"Gender of employee:"<<endl;
      cin>> e.gender;
      cout<<"Name of employee:"<<endl;
      cin>> e.name;
      cout<<"Personal ID:"<<endl;
      cin>>e.employee_id;
      cout<<"Age of employee:"<<endl;
      cin>>e.age;
      cout<<"Salary of employee:"<<endl;
      cin>>e.salary;
      e.output();
      cout<<endl<<e.employee()<<endl;
    return 0;
}
Цитата Сообщение от Tulosba Посмотреть сообщение
Создание своего типа MyString например.
как это "создать свой тип"? можно на примере?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2013, 17:26 #12
Satansoft, это Вам преподаватель такую исходную программу предоставил или кто-то уже постарался над ней?
Цитата Сообщение от Satansoft Посмотреть сообщение
как это "создать свой тип"? можно на примере?
Есть стандартный класс std::string, который обладает достаточным функционалом для работы со строками. Но, в качестве учебных заданий порой требуют реализовать свой string с блекджеком ... вот об этом и речь.
0
27.03.2013, 17:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2013, 17:26
Привет! Вот еще темы с ответами:

Конструктор и деструктор - C++
На сколько сильно они нужны и можно ли обойтись без них? Что будет если их не описывать? Что такое утечки памяти? Память забивается...

С++. Конструктор, деструктор - C++
Ребята!!! Помогите пожалуйста, не знаю как сделать это задание на С++. Нужно разработать класс Point для работы с пользовательским...

Конструктор и деструктор - C++
Нужно чтобы деструктор отработал до завершения программы #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

конструктор и деструктор в C++ - C++
Помогите добавить в прогу конструктор и деструктор #include &lt;iostream&gt; using namespace std; class preamougolinik { private: ...


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

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

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