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

Отмена создания объекта при неверных аргументах - C++

Восстановить пароль Регистрация
 
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
10.10.2013, 00:34     Отмена создания объекта при неверных аргументах #1
Всем привет!

Как можно проверить инициализирующие параметры на ошибочность и при ошибке отменить создание объекта?

C++
1
2
3
4
5
6
7
8
9
10
11
class Person
{
    string name;
public:
    Person(string n)
    { name = n }
}
int main()
{
    Person p1("Слишком длинный текст");
}
Вот тут хочу сделать так, чтобы объект p1 не создавался, при длине текста больше 10-ти.

Спасибо заранее за помощь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
10.10.2013, 00:39     Отмена создания объекта при неверных аргументах #2
Кинуть исключение в конструкторе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 00:39     Отмена создания объекта при неверных аргументах #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
using namespace std;
 
class Person
{
    string name;
public:
    Person(string n)
    { name = n; }
};
 
int main()
{
    string str = "Слишком длинный текст";
    if (str.size() > 10) cout << str << endl;
    else
        Person p1(str);
}
murtukov
 Аватар для murtukov
8 / 8 / 3
Регистрация: 30.01.2013
Сообщений: 99
10.10.2013, 00:46  [ТС]     Отмена создания объекта при неверных аргументах #4
alsav22, спасибо конечно, но мне бы хотелось реализовать сие в самом классе.

ct0r, можно маленький примерчик?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 00:59     Отмена создания объекта при неверных аргументах #5
Цитата Сообщение от murtukov Посмотреть сообщение
но мне бы хотелось реализовать сие в самом классе.
В классе объект не создаётся (если только объект - не поле класса). Конструктор не создаёт объект, а инициализирует уже созданный.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
10.10.2013, 01:00     Отмена создания объекта при неверных аргументах #6
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>
#include <stdexcept>
#include <string>
 
class Person
{
public:
    Person(const std::string s)
    {
        if (s.length() > 10) {
            throw std::length_error("name too long");
        }
        name_ = s;
    }
private:
    std::string name_;
};
 
int main()
{
    const std::string str1 = "blablabla";
    Person p1(str1);
    try {
        const std::string str2 = "blablablabla";
        Person p2(str2);
    } catch (std::exception & e) {
        std::cout << e.what() << std::endl;
    }
}
Хочу обратить внимание, что такой способ применяется только тогда, когда с такими данными объекты класса не могут существовать в принципе (например при этих данных будет нарушена их внутренняя структура, инварианты или прочее).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 01:02     Отмена создания объекта при неверных аргументах #7
Цитата Сообщение от ct0r Посмотреть сообщение
Person p2(str2);
Вот тут, объект p2 уже создан, и никакое исключение этого не отменит.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
10.10.2013, 01:09     Отмена создания объекта при неверных аргументах #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот тут объект p2 уже создан, и никакое исключение этого не отменит.
Что? Объект создан только тогда, когда полностью выполнился его конструктор. До этого момента он максимум может считаться частично созданным.

Прочитай пункт 15.2.2 стандарта, там написано, что делается, когда исключение кидается в конструкторе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 01:14     Отмена создания объекта при неверных аргументах #9
ct0r, создание локального объекта не смущает?

Добавлено через 46 секунд
Цитата Сообщение от ct0r Посмотреть сообщение
Объект создан только тогда, когда полностью выполнился его конструктор.
Объект создан тогда, когда под него память выделена.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
10.10.2013, 01:23     Отмена создания объекта при неверных аргументах #10
Цитата Сообщение от alsav22 Посмотреть сообщение
ct0r, создание локального объекта не смущает?

Добавлено через 46 секунд

Объект создан тогда, когда под него память выделена.
А должно? Да вообще без разницы где память, хоть на стеке, хоть в куче, все равно компилятор чистит после исключения.
С чего ты взял, что объект создан тогда, когда память выделена?) Когда память выделена, это значит лишь то, что память выделена, не более. По твоей логике placement new создает объект, а не выделяет под него память, что очевидно неверно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 02:21     Отмена создания объекта при неверных аргументах #11
Цитата Сообщение от ct0r Посмотреть сообщение
С чего ты взял, что объект создан тогда, когда память выделена?)

Не по теме:

А что ты мне тыкаешь? На брудершафт пили?


Почему только я? Тут почитайте: http://www.cyberforum.ru/blogs/18334/blog103.html
3. Время жизни объекта и память, выделяемая под объект

Понятие времени жизни объекта с точки зрения нашей статьи практически полностью совпадает с общепринятыми понятиями и тем, что пишут в учебниках. Но для порядка немного об этом напишу, чтобы статья имела некую целостность. Да и начинающим будет нелишним ещё раз привести знания в порядок.

Временем жизни (lifetime) объекта называют тот период времени работы программы, в течение которого память, выделенная при создании объекта, закрепляется за этим объектом. Другими словами, если мы в течение времени жизни объекта будем обращаться к его памяти, то мы прочитаем корректное значение (при условии, что у нас в программе нет ошибок по записи в чужую память)

Время жизни автоматического объекта начинается в момент его объявления. Можно считать, что начиная с момента исполнения начала процедуры или лексического блока память под объект выделена. Я не буду заострять внимания на том, каким образом компилятор обеспечивает выделение памяти, важно лишь то, что начиная с этого момента к этой памяти можно обращаться на законных основаниях и эта память закреплена за этим объектом. Время жизни автоматического объекта заканчивается при выходе управления программы из процедуры или лексического блока, в котором определён объект. В этот момент можно считать, что память освобождается. Здесь опять-таки хочется упомянуть, что реально память не освобождается и к ней можно обратиться, но компилятор уже не гарантирует, что в этой памяти сохранится значение переменной, т.к. компилятор или система с этого момента имеют право использовать эту память по своему усмотрению.
4. Конструкторы и деструкторы

Прежде всего хочется указать на одну из самых распространённых ошибок начинающих: они считают, что конструктор выделяет память для объекта (создаёт объект), а деструктор - освобождает память (удаляет объект). Это неверно! Процесс выделения памяти для объекта описан в предыдущей главе. А конструктор только инициализирует объект (т.е. задаёт объекту некоторое начальное значение). Очень важно это понимать. Непонимание обычно растёт из того, что эти два этапа с точки зрения языка обычно выглядят в виде одного оператора. Компилятор обеспечивает механизм, при котором в процессе создания объекта выделяется память под объект и вызывается метод-конструктор. Но эти две вещи не обязательно выполняются подряд одна за другой. Аналогично в процессе удаления объект вызывается метод-деструктор и затем происходит высвобождение памяти.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
10.10.2013, 03:00     Отмена создания объекта при неверных аргументах #12
Цитата Сообщение от alsav22 Посмотреть сообщение

Не по теме:

А что ты мне тыкаешь? На брудершафт пили?


Почему только я? Тут почитайте: http://www.cyberforum.ru/blogs/18334/blog103.html
Увы, в любом случае я не пью. А на форумах я всегда тыкаю и вообще очень невоспитанный)

По поводу статьи. Для кого она написана? Для новичков, чтобы им было все понятно и без лишних деталей, но мы-то с тобой профессионалы (я надеюсь) и никому не верим на слово, только официальному стандарту. И вот что там написано (пункт 3.8.1):
The lifetime of an object is a runtime property of the object. The lifetime of an object of type T begins
when:
— storage with the proper alignment and size for type T is obtained, and
— if T is a class type with a non-trivial constructor (12.1), the constructor call has completed.
Добавлено через 6 минут
Цитата Сообщение от ct0r Посмотреть сообщение
Person(const std::string s)
Тут я немного опечатался. Лучше
C++
1
explicit Person(const std::string & s)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 03:23     Отмена создания объекта при неверных аргументах
Еще ссылки по теме:

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
C++ Пишет function does not take arguments при любых аргументах
Передача существующего объекта вместо создания нового C++

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

Или воспользуйтесь поиском по форуму:
alsav22
10.10.2013, 03:23     Отмена создания объекта при неверных аргументах
  #13

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
но мы-то с тобой профессионалы (я надеюсь)
Зря надеетесь. Я начинающий.

Yandex
Объявления
10.10.2013, 03:23     Отмена создания объекта при неверных аргументах
Ответ Создать тему
Опции темы

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