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

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

Войти
Регистрация
Восстановить пароль
 
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 699
26.03.2013, 23:50     Конструктор и Деструктор (инициализация массивов) #1
Стал вопрос по инициализации массивов (внутри класса) в конструкторе, но ни методичка, ни гугль явного ответа не дали, возможно массив символов проще преобразовать в строку?

Часть кода ко конструктора и деструктора включительно, опять же интересен вариант преобразования типа 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 23:50     Конструктор и Деструктор (инициализация массивов)
Посмотрите здесь:

C++ конструктор и деструктор
конструктор и деструктор в C++ C++
C++ конструктор и деструктор
C++ Конструктор и деструктор
Конструктор/деструктор C++
C++ Конструктор и деструктор
C++ Конструктор и деструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2013, 12:21     Конструктор и Деструктор (инициализация массивов) #2
Цитата Сообщение от Satansoft Посмотреть сообщение
но при инициализации проблемы с вызовом из мейна:
Так у Вас конструктора по умолчанию нет. Либо создайте его, либо замените 46 строку на нечто такое:
C++
1
card e ("male", "man", 0, 0, 0.0 );
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 699
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;
}
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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 более адекватный, чем всё остальное.
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 699
27.03.2013, 13:31  [ТС]     Конструктор и Деструктор (инициализация массивов) #5
Tulosba, я так понял первый конструктор инициализирует, а второй выделяет память, но действительно по указателям... А деструктор только выводит... Задача состоит: Конструктор - выделение памяти, Деструктор - вывод и удаление выделенной памяти...
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2013, 14:10     Конструктор и Деструктор (инициализация массивов) #6
Цитата Сообщение от Satansoft Посмотреть сообщение
первый конструктор инициализирует, а второй выделяет память,
Конструкторы должны быть равноправны. Любой конструктор должен создавать полноценный объект. Если этого не происходит, значит присутствует ошибка при проектировании.
Цитата Сообщение от Satansoft Посмотреть сообщение
Задача состоит: Конструктор - выделение памяти
Выделение памяти - это значит, что нужно вставлять new куда попало. Если в конструкторе инициализируется строка (string), то класс string сам позаботиться о выделении и высвобождении памяти под строку.
Цитата Сообщение от Satansoft Посмотреть сообщение
Деструктор - вывод и удаление выделенной памяти...
Вывод к деструктору не должен иметь никакого отношения. Если в конструкторе не было самостоятельного выделения ресурсов, то деструктор не нужен вовсе.
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 699
27.03.2013, 14:17  [ТС]     Конструктор и Деструктор (инициализация массивов) #7
Формулировка задачи:
Для класса, задать конструктор (для выделения памяти, открытия файлов, задания начальных значений при необходимости) и деструктор (для освобождения памяти, закрытия файлов, печати
последних значений).

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

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

Однако, если по заданию от Вас требуют выделения памяти, то, вероятно, в обучающих целях не нужно использовать готовые классы типа string, а самому заморочиться созданием "велосипеда"
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 699
27.03.2013, 14:47  [ТС]     Конструктор и Деструктор (инициализация массивов) #9
Tulosba, Во-первых, не ясно что подразумевается под открытием и закрытием файлов в задаче о.О Во-вторых, вопрос удаления выделенной памяти остается открытым, удаление через деструктор ессесно...
И о каком "велосипеде" речь? По заданию нужно модифицировать программу, написанную по теме "Инициализация классов", добавив констр. и дестр. с соответствующим функционалом, что я и сделал, с одним отличием: char* to string.
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2013, 16:09     Конструктор и Деструктор (инициализация массивов) #10
Цитата Сообщение от Satansoft Посмотреть сообщение
По заданию нужно модифицировать программу, написанную по теме "Инициализация классов"
Где эта исходная программа?
Цитата Сообщение от Satansoft Посмотреть сообщение
И о каком "велосипеде" речь?
Создание своего типа MyString например.
Satansoft
 Аватар для Satansoft
7 / 7 / 1
Регистрация: 27.02.2012
Сообщений: 699
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 например.
как это "создать свой тип"? можно на примере?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2013, 17:26     Конструктор и Деструктор (инициализация массивов)
Еще ссылки по теме:

C++ С++. Конструктор, деструктор
Конструктор, деструктор C++
Конструктор и деструктор C++
Конструктор и деструктор C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4382 / 3225 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2013, 17:26     Конструктор и Деструктор (инициализация массивов) #12
Satansoft, это Вам преподаватель такую исходную программу предоставил или кто-то уже постарался над ней?
Цитата Сообщение от Satansoft Посмотреть сообщение
как это "создать свой тип"? можно на примере?
Есть стандартный класс std::string, который обладает достаточным функционалом для работы со строками. Но, в качестве учебных заданий порой требуют реализовать свой string с блекджеком ... вот об этом и речь.
Yandex
Объявления
27.03.2013, 17:26     Конструктор и Деструктор (инициализация массивов)
Ответ Создать тему
Опции темы

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