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

выделение памяти и присвоение чару - C++

Восстановить пароль Регистрация
 
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 19:20     выделение памяти и присвоение чару #1
Здравствуйте, помогите пожалуйста с заданием. Там где стрелочка, нужно выделить память под holiday::name и присвоить holiday::name сам name. Все подобно day и month. Моим способом компилятор не ругается а чисто выдает ошибку при старте программы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class holiday
{
private:
int month;
int day;
char *name;
public:
holiday(const char *name,int day,int month);
};
 
void main()
{
holiday christmas("Christmas", 7, 1);
}
 
holiday::holiday(const char *name,int day, int month)
{
         <<<---- 
    holiday::day = day;
    holiday::month = month;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 19:20     выделение памяти и присвоение чару
Посмотрите здесь:

Выделение памяти C++
C++ Выделение памяти (new)
Выделение памяти C++
Выделение памяти C++
C++ Выделение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 19:33     выделение памяти и присвоение чару #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class holiday
{
public:
    holiday(char *name,int day,int month) :
      name_(name), day_(day), month_(month) {}
 
private:
    int month_;
    int day_;
    char *name_;
};
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 19:39  [ТС]     выделение памяти и присвоение чару #3
Цитата Сообщение от GetVariable Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class holiday
{
public:
    holiday(char *name,int day,int month) :
      name_(name), day_(day), month_(month) {}
 
private:
    int month_;
    int day_;
    char *name_;
};
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
Там где стрелочка, нужно выделить память под holiday::name и присвоить holiday::name сам name.
А это полностью не соответствует заданию...
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 19:47     выделение памяти и присвоение чару #4
Цитата Сообщение от Angels737 Посмотреть сообщение
Там где стрелочка, нужно выделить память под holiday::name и присвоить holiday::name сам name.
А это полностью не соответствует заданию...
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
#include <iostream>
 
class holiday
{
public:
    holiday(const char *name,int day,int month);
 
private:
    int month;
    int day;
    char *name;
 
};
 
holiday::holiday(const char *name,int day, int month)
{
    this->name = (char *)name;
    this->day = day;
    this->month = month;
}
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
здесь ничего выделять не нужно. в чём вопрос? первый вариант является копией этого, только более компактные
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 19:52  [ТС]     выделение памяти и присвоение чару #5
Цитата Сообщение от GetVariable Посмотреть сообщение
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
#include <iostream>
 
class holiday
{
public:
    holiday(const char *name,int day,int month);
 
private:
    int month;
    int day;
    char *name;
 
};
 
holiday::holiday(const char *name,int day, int month)
{
    this->name = (char *)name;
    this->day = day;
    this->month = month;
}
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
здесь ничего выделять не нужно. в чём вопрос? первый вариант является копией этого, только более компактные
3. Поле name должно быть динамическим: char *name. Конструктор выделяет под него память, деструктор - освобождает.
к сожалению препод может не согласиться с тобой))
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 19:54     выделение памяти и присвоение чару #6
Цитата Сообщение от Angels737 Посмотреть сообщение
3. Поле name должно быть динамическим: char *name. Конструктор выделяет под него память, деструктор - освобождает.
к сожалению препод может не согласиться с тобой))
В C++ для динамической идентификации типов[1] применяются операторы dynamic_cast и typeid (определён в файле typeinfo.h), для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.

Оператор dynamic_cast пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или void*.
Если целевой тип — тип указателя, то аргументом должен быть указатель на объект класса.
Если целевой тип — ссылка, то аргумент должен также быть соответствующей ссылкой.
Если целевым типом является void*, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.
http://ru.wikipedia.org/wiki/Динамич...ия_типа_данных
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 19:55  [ТС]     выделение памяти и присвоение чару #7
Спасибо большое, все работает
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 19:58     выделение памяти и присвоение чару #8
вы забыли сказать про дестуруктор, вот с деструктором

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
#include <iostream>
 
class holiday
{
public:
    holiday(const char *name,int day,int month);
 
    ~holiday()
    {
        delete[] name;
    }
 
private:
    int month;
    int day;
    char *name;
 
};
 
holiday::holiday(const char *name,int day, int month)
{
    this->name = (char *)name;
    this->day = day;
    this->month = month;
}
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
Добавлено через 2 минуты
также теперь при выполнение операций будет выбивать исключения.

ибо нужен ещё конструктор копирования.

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
#include <iostream>
 
class holiday
{
public:
    holiday(const char *name,int day,int month);
 
    ~holiday()
    {
        delete[] name;
    }
 
    holiday(const holiday& u)
    {
            name = new char[strlen(u.name) + 1];
            strcpy(name, u.name);
    }
    
 
private:
    int month;
    int day;
    char *name;
 
};
 
holiday::holiday(const char *name,int day, int month)
{
    this->name = (char *)name;
    this->day = day;
    this->month = month;
}
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
08.04.2013, 20:04     выделение памяти и присвоение чару #9
GetVariable, и что же будет по Вашему удалять деструктор?
Ну а во-вторых
C++
1
this->name = (char *)name;
Так делать нельзя. Указатель имеет тип char, ему присваивается тип const char *, что как бы подразумевает, что данные константные, и не должны меняться. Тем более строковые литералы. Это undefined behaviour.
Ну а тем более удалять их командой delete...


Angels737,

C++
1
2
3
4
5
6
7
8
9
10
11
holiday::holiday(const char *str,int day, int month)
{
name = new char [ strlen( str ) + 1 ];
strcpy( name, str );
holiday::day = day;
holiday::month = month;
}
 
holiday::~holiday() {
   delete [] name;
}
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 20:12     выделение памяти и присвоение чару #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
GetVariable, и что же будет по Вашему удалять деструктор?
Ну а во-вторых
C++
1
this->name = (char *)name;
Так делать нельзя. Указатель имеет тип char, ему присваивается тип const char *, что как бы подразумевает, что данные константные, и не должны меняться. Тем более строковые литералы. Это undefined behaviour.
Ну а тем более удалять их командой delete...


Angels737,

C++
1
2
3
4
5
6
7
8
9
10
11
holiday::holiday(const char *str,int day, int month)
{
name = new char [ strlen( str ) + 1 ];
strcpy( name, str );
holiday::day = day;
holiday::month = month;
}
 
holiday::~holiday() {
   delete [] name;
}


1. выделенную память по указателю name

2.
Так делать нельзя. Указатель имеет тип char, ему присваивается тип const char *, что как бы подразумевает, что данные константные, и не должны меняться.
в процессе они и не меняются, в каком виде они передаются в таком и присваиваются.

3. чем вам не нравится освобождение памяти? если это было дано в ТЗ?

Добавлено через 2 минуты
Да и вообще, результат будет одинаковым, что он от моего решения, что от вашего.

оба правильные.
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 20:16  [ТС]     выделение памяти и присвоение чару #11
GetVariable
Спасибо, очень помогли
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 20:17     выделение памяти и присвоение чару #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
GetVariable, и что же будет по Вашему удалять деструктор?
Ну а во-вторых
C++
1
this->name = (char *)name;
Так делать нельзя. Указатель имеет тип char, ему присваивается тип const char *, что как бы подразумевает, что данные константные, и не должны меняться. Тем более строковые литералы. Это undefined behaviour.
Ну а тем более удалять их командой delete...


Angels737,

C++
1
2
3
4
5
6
7
8
9
10
11
holiday::holiday(const char *str,int day, int month)
{
name = new char [ strlen( str ) + 1 ];
strcpy( name, str );
holiday::day = day;
holiday::month = month;
}
 
holiday::~holiday() {
   delete [] name;
}
я ошибся. спасибо, что указали на ошибку. я заново просмотрел свой код и увидел ошибку. в следующий раз учту.
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 20:18  [ТС]     выделение памяти и присвоение чару #13
Цитата Сообщение от GetVariable Посмотреть сообщение

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
#include <iostream>
 
class holiday
{
public:
    holiday(const char *name,int day,int month);
 
    ~holiday()
    {
        delete[] name;
    }
 
    holiday(const holiday& u)
    {
            name = new char[strlen(u.name) + 1];
            strcpy(name, u.name);
    }
    
 
private:
    int month;
    int day;
    char *name;
 
};
 
holiday::holiday(const char *name,int day, int month)
{
    this->name = (char *)name;
    this->day = day;
    this->month = month;
}
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
Спасибо, очень помогли
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
08.04.2013, 20:19     выделение памяти и присвоение чару #14
вот правильный вариант.

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
#include <iostream>
 
class holiday
{
public:
    holiday(const char *name,int day,int month);
 
    ~holiday()
    {
        delete[] name;
    }
 
    holiday(const holiday& u)
    {
            name = new char[strlen(u.name) + 1];
            strcpy(name, u.name);
    }
    
 
private:
    int month;
    int day;
    char *name;
 
};
 
holiday::holiday(const char *str,int day, int month)
{
    name = new char [ strlen( str ) + 1 ];
    strcpy(name, str);
    this->day = day;
    this->month = month;
}
 
int main()
{
    holiday christmas("Christmas", 7, 1);
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 20:29     выделение памяти и присвоение чару
Еще ссылки по теме:

C++ выделение памяти
C++ Выделение памяти
Выделение памяти(С = С++) C++

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

Или воспользуйтесь поиском по форуму:
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 20:29  [ТС]     выделение памяти и присвоение чару #15
Цитата Сообщение от GetVariable Посмотреть сообщение
~holiday()
{
delete[] name;
}
Объясните пожалуйста что конкретно делает эта вещь ( знак табуляции, про delete понятно ).
Yandex
Объявления
08.04.2013, 20:29     выделение памяти и присвоение чару
Ответ Создать тему
Опции темы

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