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

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

Войти
Регистрация
Восстановить пароль
 
Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
#1

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

05.11.2013, 02:32. Просмотров 422. Ответов 12
Метки нет (Все метки)

Я то ли динамику недопоняла, то ли классы, то ли конструктор... И теперь совсем запуталась.

Что нужно написать в конструкторе без параметров, что бы можно было создавать объекты класса просто
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++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

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

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Конструктор по умолчанию - C++
У меня получается создавать конструктор по умолчанию если в хедере эти значения указаны: class Unit { protected: string name; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
05.11.2013, 02:34 #2
Можете присвоить указателям нулевое значение.

P.S. Еще оператор присваивания и конструктор копий надо сделать для этого класса
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.11.2013, 03:24 #7
Цитата Сообщение от Сонца Посмотреть сообщение
Про конструктор копирования еще пока ничего не знаю, увы.
читай
http://ru.wikipedia.org/wiki/Конструктор_копирования
вот еще рекомендую
http://www.e-reading.biz/book.php?book=1002058
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
05.11.2013, 04:13 #8
А также if-ы в деструкторе, иначе еррор при попытке удалить объект, созданный конструктором по умолчанию.

Советую использовать std::string если задание не предполагает обучение навыкам работы с динамической памятью.
ct0r
Игогошка!
1769 / 671 / 42
Регистрация: 19.08.2012
Сообщений: 1,284
Завершенные тесты: 1
05.11.2013, 04:21 #9
Цитата Сообщение от MrGluck Посмотреть сообщение
А также if-ы в деструкторе, иначе еррор при попытке удалить объект, созданный конструктором по умолчанию.
Зачем ифы? Какой еррор?
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
05.11.2013, 11:22 #12
Цитата Сообщение от Сонца Посмотреть сообщение
Так? Или как-то иначе?
Так. Но если условия убрать, то ошибок не будет )
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.11.2013, 11:23 #13
Цитата Сообщение от Сонца Посмотреть сообщение
Так? Или как-то иначе?
как было в начале
delete NULL ни к чему страшному не приведет, просто не выполнится
следовательно смысла в этой проверке нет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2013, 11:23
Привет! Вот еще темы с ответами:

Конструктор по умолчанию - C++
Показывает ошибку : 1 IntelliSense: для класса "tovar" не существует конструктор по умолчанию Подскажите пожалуйста как сделать ...

Конструктор по умолчанию - C++
Здраститя. #include <iostream> using namespace std; class random { public: random(int b){a=b;} ~random(){} int...

Конструктор по умолчанию - C++
как использовать конструктор по умолчанию в конструкторе с параметром? К по умолчанию заполняет массив заранее определёнными символами, а...

Конструктор по умолчанию - C++
Всем привет! Если в классе вообще нет конструктора, чем будут инициализироваться члены класса? И в чем отличие объект() и объект...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.11.2013, 11:23
Ответ Создать тему
Опции темы

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