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

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

Войти
Регистрация
Восстановить пароль
 
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
#1

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

08.04.2013, 19:20. Просмотров 554. Ответов 14
Метки нет (Все метки)

Здравствуйте, помогите пожалуйста с заданием. Там где стрелочка, нужно выделить память под 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 19:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос выделение памяти и присвоение чару (C++):

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Выделение памяти... - C++
Вот решил себе ликбез устроить и возникли вопросы: 1) Почему char* p = &quot;fffff&quot;; не реагирует на delete p 2) Когда надо...

выделение памяти - C++
#include &lt;iostream&gt; using namespace std; class Matrix { int m, n; public: float **M; Matrix(int a, int b); void...

Выделение памяти - C++
int main() { FILE *fIn = NULL, *fOut =NULL; Error EMyError; CNodeStack *Start; CNodeStack *ListF = new CNodeStack; ...

Выделение памяти - C++
Скажите пожалуйста что не так? Не могу получить доступ к элементу str = 12, stlb = 3 bool** tempValues = new(bool*); for(int i = 0;...

14
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;
}
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.
А это полностью не соответствует заданию...
0
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;
}
здесь ничего выделять не нужно. в чём вопрос? первый вариант является копией этого, только более компактные
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. Конструктор выделяет под него память, деструктор - освобождает.
к сожалению препод может не согласиться с тобой))
0
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/Динамическая_идентификация_типа_данных
0
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 19:55  [ТС] #7
Спасибо большое, все работает
0
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;
}
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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;
}
1
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 минуты
Да и вообще, результат будет одинаковым, что он от моего решения, что от вашего.

оба правильные.
0
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 20:16  [ТС] #11
GetVariable
Спасибо, очень помогли
0
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;
}
я ошибся. спасибо, что указали на ошибку. я заново просмотрел свой код и увидел ошибку. в следующий раз учту.
0
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;
}
Спасибо, очень помогли
0
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;
}
0
Angels737
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 17
08.04.2013, 20:29  [ТС] #15
Цитата Сообщение от GetVariable Посмотреть сообщение
~holiday()
{
delete[] name;
}
Объясните пожалуйста что конкретно делает эта вещь ( знак табуляции, про delete понятно ).
0
08.04.2013, 20:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2013, 20:29
Привет! Вот еще темы с ответами:

Выделение памяти - C++
Во время выполнения программы после ввода нескольких символов выводит ошибку: double free or corruption(out): 0x0000000001157010 ***...

Не выделение памяти - C++
По какой причине не работает это программа ? #include&lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () ...

Выделение памяти - C++
Какая разница между выделением памяти функциями malloc, calloc, realloc и оператором new? И как изменить размер выделенной памяти без...

Выделение памяти - C++
Всем доброго времени суток! Пытаюсь сделать связанный список на 100кк элементов, но не выделив памяти и под половину, программа жрёт 4...


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

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

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