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

Конструктор по умолчанию - C++

Восстановить пароль Регистрация
 
Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 02:32     Конструктор по умолчанию #1
Я то ли динамику недопоняла, то ли классы, то ли конструктор... И теперь совсем запуталась.

Что нужно написать в конструкторе без параметров, что бы можно было создавать объекты класса просто
C++
1
 Student stud;
а, не
C++
1
Student stud ("a", "b", 1, "c");
учитывая, что методы SetName и SetGroup выделяют динамическую память для поля по размеру передаваемого параметра перед записью в них. Теоретически я понимаю, что можно выделять некоторое число памяти и вписывать туда "что-то" в пределах выделенной памяти, но будет ли это правильным подходом если нужен "пустой" объект?

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
class Student
{
    char * firstName;
    char * lastName;
    short age;
    char * group;
 
public:
    Student (char * f_n, char * l_n, short _a, char * g_str) 
    {
        firstName = new char [strlen(f_n) + 1]; strcpy_s (firstName, strlen(f_n) + 1, f_n);
        lastName = new char [strlen(l_n) + 1]; strcpy_s (lastName, strlen(l_n) + 1, l_n);
        age = _a;
        group = new char [strlen(g_str) + 1]; strcpy_s (group, strlen(g_str) + 1, g_str);
    }
    ~Student () 
    { delete []firstName; delete []lastName; delete []group;}
 
    void Info();
    void SetName (char * fname, char * lname);
    void SetGroup (char * gname);
    void SetAge (short a);
    short GetAge();
    char * GetName ();
};
p.s. может выражаю свой вопрос не корректно, заранее прошу извинить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2013, 02:32     Конструктор по умолчанию
Посмотрите здесь:

C++ конструктор по умолчанию
C++ Конструктор по умолчанию
C++ Конструктор по умолчанию
C++ Конструктор по умолчанию
C++ Конструктор по умолчанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
05.11.2013, 02:34     Конструктор по умолчанию #2
Можете присвоить указателям нулевое значение.

P.S. Еще оператор присваивания и конструктор копий надо сделать для этого класса
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
05.11.2013, 02:39     Конструктор по умолчанию #3
Цитата Сообщение от Сонца Посмотреть сообщение
Теоретически я понимаю, что можно выделять некоторое число памяти и вписывать туда "что-то" в пределах выделенной памяти, но будет ли это правильным подходом если нужен "пустой" объект?
нет
правильно будет так
C++
1
2
3
4
5
6
7
 Student () 
{
  firstName = NULL;
  lastName = NULL;
  age =0
  group = NULL;
 }
Добавлено через 1 минуту
да и вот это обязательно
Цитата Сообщение от Croessmah Посмотреть сообщение
Еще оператор присваивания и конструктор копий надо сделать для этого класса
Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 03:07  [ТС]     Конструктор по умолчанию #4
Croessmah, ValeryS, благодарю. Но попутно вопрос, нужно (и если да, то как) проверять или отслеживать попытки использовать объект без "информационной" инициализации, а только с NULL?


Это можно считать оператором присваивания или речь о чем-то другом? Про конструктор копирования еще пока ничего не знаю, увы.
C++
1
2
3
4
5
6
7
8
9
10
    void operator = (Student & st2)
    {
        firstName = new char [strlen (st2.firstName) + 1];
        strcpy_s (firstName, strlen (st2.firstName) + 1, st2.firstName);
        lastName = new char[strlen (st2.lastName) + 1];
        strcpy_s (lastName, strlen (st2.lastName) + 1, st2.lastName);
        age = st2.age;
        group = new char[strlen (st2.group) + 1];
        strcpy_s (group, strlen (st2.group) + 1, st2.group);
    }
И вопрос. Если метод SetName выглядит так, то нужно ли мне проверять является ли поле NULL указателем и если в нем уже что-то есть - предварительно освобождать уже занятую память?
C++
1
2
3
4
5
6
7
void Student::SetName (char * fName, char * lName)
{
    firstName = new char [strlen (fName) + 1];
    lastName = new char [strlen (lName) + 1];
    strcpy_s (firstName, strlen (fName) + 1,  fName);
    strcpy_s (lastName, strlen (lName) + 1, lName);
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
05.11.2013, 03:15     Конструктор по умолчанию #5
Цитата Сообщение от Сонца Посмотреть сообщение
Если метод SetName выглядит так, то нужно ли мне проверять является ли поле NULL указателем и если в нем уже что-то есть - предварительно освобождать уже занятую память?
Точно.
Код
Если указатель не равен нулю {
   освобождаем уже выделенную память.
}
выделяем память, заполняем чем нужно
Добавлено через 4 минуты
Цитата Сообщение от Сонца Посмотреть сообщение
Про конструктор копирования еще пока ничего не знаю, увы.
Ну значит скоро уже узнаете
Цитата Сообщение от Сонца Посмотреть сообщение
Но попутно вопрос, нужно (и если да, то как) проверять или отслеживать попытки использовать объект без "информационной" инициализации, а только с NULL?
Если указатель равен нулю, то принимать какие-то меры (какие именно - решать Вам)
Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 03:18  [ТС]     Конструктор по умолчанию #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну значит скоро уже узнаете
Очень много информации Сама стараюсь читать, пробовать, и хорошо что, есть отзывчивые люди, которые не проходят мимо Мне еще нужно прикрутить методы с файлами и если все пройдет благополучно, то прямо сегодня и узнаю
Еще раз благодарю за помощь.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
05.11.2013, 03:24     Конструктор по умолчанию #7
Цитата Сообщение от Сонца Посмотреть сообщение
Про конструктор копирования еще пока ничего не знаю, увы.
читай
http://ru.wikipedia.org/wiki/Конструктор_копирования
вот еще рекомендую
http://www.e-reading.biz/book.php?book=1002058
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
05.11.2013, 04:13     Конструктор по умолчанию #8
А также if-ы в деструкторе, иначе еррор при попытке удалить объект, созданный конструктором по умолчанию.

Советую использовать std::string если задание не предполагает обучение навыкам работы с динамической памятью.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
05.11.2013, 04:21     Конструктор по умолчанию #9
Цитата Сообщение от MrGluck Посмотреть сообщение
А также if-ы в деструкторе, иначе еррор при попытке удалить объект, созданный конструктором по умолчанию.
Зачем ифы? Какой еррор?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
05.11.2013, 04:55     Конструктор по умолчанию #10
Цитата Сообщение от ct0r Посмотреть сообщение
Зачем ифы? Какой еррор?
Это я загнался по поводу удаления NULL, но сейчас глянул в стандарт - там delete и delete[] обязуют проверять на NULL перед освобождением памяти, так что все в порядке.

Добавлено через 4 минуты

Не по теме:

Видимо пора спать

Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
05.11.2013, 11:19  [ТС]     Конструктор по умолчанию #11
Цитата Сообщение от MrGluck Посмотреть сообщение
Советую использовать std::string если задание не предполагает обучение навыкам работы с динамической памятью.
Задание требует, чтобы поля класса были динамическими. Не смотря на то, что вчера было первое занятие в стиле "ввод в ооп, класс это ...". Что-то читаю сама. Задача научится и разобраться, хотя и получается немного сумбурно, поскольку нужно все и сразу.

Цитата Сообщение от MrGluck Посмотреть сообщение
но сейчас глянул в стандарт - там delete и delete[] обязуют проверять на NULL перед освобождением памяти, так что все в порядке.
C++
1
2
3
4
5
6
7
8
9
        ~Student () 
        { 
            if (firstName != nullptr)
                delete []firstName; 
            if (lastName != nullptr)
                delete []lastName;
            if (group != nullptr)
                delete []group;
        }
Так? Или как-то иначе?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
05.11.2013, 11:22     Конструктор по умолчанию #12
Цитата Сообщение от Сонца Посмотреть сообщение
Так? Или как-то иначе?
Так. Но если условия убрать, то ошибок не будет )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2013, 11:23     Конструктор по умолчанию
Еще ссылки по теме:

C++ Конструктор по умолчанию
Конструктор по умолчанию C++
C++ Конструктор по умолчанию

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
05.11.2013, 11:23     Конструктор по умолчанию #13
Цитата Сообщение от Сонца Посмотреть сообщение
Так? Или как-то иначе?
как было в начале
delete NULL ни к чему страшному не приведет, просто не выполнится
следовательно смысла в этой проверке нет
Yandex
Объявления
05.11.2013, 11:23     Конструктор по умолчанию
Ответ Создать тему
Опции темы

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