14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
1

защита от некорректных данных в конструкторе

20.12.2015, 20:29. Показов 2086. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

вот пишу довольно тривиальный класс о представлении треугольника. Поля класса - углы и стороны.
По моему мнению для удобной работы с классом должно быть несколько конструкторов. Один из них такой, который принимает в качестве аргументов три угла, то есть

C++ (Qt)
1
Triangle Object1(60,60,60); // треугольник с тремя углами по 60 градусов.
Вопрос у меня такой: допустим, что пользователь вводит в аргументы конструктора три аргумента, сумма которых превышает 180 градусов. Очевидно, что такого треугольника быть не может. Как сделать так, чтобы была защита от некорректных данных без сложной обработки исключений. Конструктор ведь не может ничего возвратить.

C++ (Qt)
1
2
3
4
5
6
7
8
Triangle::Triangle(int Angle1, int Angle2, int Angle3){
    if(Angle1+Angle2+Angle3==180){
       Angle1= angleOne;
       Angle2= angleTwo;
       Angle3= angleThree;
    }  
    else // что тут??
}
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2015, 20:29
Ответы с готовыми решениями:

Защита от ввода некорректных данных в консольной программе
#include "stdafx.h" #include <iostream> #include <cstdlib> #include <conio.h> #include <cmath>...

Защита от ввода некорректных данных, например в формате 2,5е+10
Здравствуйте! Помогите сделать "защиту от дурака" - ввод некорректных данных. Необходимо в...

Вычисление квадратного корня: защита от некорректных данных
Всем привет. Начал потихоньку изучать паскаль abc net. Короче, написал я прогу для вычисления...

Защита от ввода некорректных значений
Всем здравствуйте, решил поставить на защиту от ввода некорректных значений свою программку....

7
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
20.12.2015, 20:34 2
Предусмотри состояние объекта и функцию, которая будет его возвращать. Типа, isValid().
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.12.2015, 20:47 3
А еще лучше проверяйте аргументы перед созданием объекта Triangle
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
20.12.2015, 20:48  [ТС] 4
rikimaru2013, это каким образом?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.12.2015, 21:00 5
Blitzor DDD, если в коде Triangle Object1(60,60,60); тоесть аргументы это литералы, то вся ответственность ан программисте - незачем было "гавнокодить", а если аргументы приходят в процессе выполнения, по можно обычной проверкой это отсёчь:
C++
1
2
3
4
5
6
7
8
9
10
11
void createTriangle( const int a, const int b, const int c )
{
   if(a + b + c != 180)
   {
      DBG( "Error: incorrect arguments to construct Triangle: %d, %d, %d", a, b, c );
   }
   else
   {
      Triangle obj( a, b, c );
   }
}
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.12.2015, 21:01 6
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
без сложной обработки исключений
http://rextester.com/IUEE91255

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
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef OUT_TO_STREAM
    #define OUT_TO_STREAM(type_)  \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
 
#include <iostream>
 
class Triangle
{
    bool mValid;
    size_t mAngle1, mAngle2, mAngle3;
 
    
    OUT_TO_STREAM(Triangle)
    {
        os << "triangle(" 
           << obj.mAngle1 << ", " 
           << obj.mAngle2 << ", "
           << obj.mAngle3 << ")";
    }
public:    
    Triangle(const size_t angle1, const size_t angle2, const size_t angle3)
        :mValid(false)
        ,mAngle1(angle1)
        ,mAngle2(angle2)            
        ,mAngle3(angle3)    
    {
        if(angle1+angle2+angle3==180)
            mValid = true;
    }  
    
    explicit operator bool()const {  return mValid; }
    
    bool operator!()const    { return !mValid; }   
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Triangle example1(60,60,60);
    if(example1)
        std::cout << example1 << " is valid\n";
    
    Triangle example2(60,70,60);
    
    if(!example2)
        std::cout << example2 << " is invalid\n";
    
}
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.12.2015, 21:04 7
hoggy, ну вы же понимаете, что концепсия создание невалидного объекта на момент выполнения конструктора - дело не благодарное) Объект может потерять валидность на этапе выполнения программы, а тут мы заведомо строим домик без кирпичиков.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.12.2015, 21:22 8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну вы же понимаете, что концепсия создание невалидного объекта на момент выполнения конструктора - дело не благодарное) Объект может потерять валидность на этапе выполнения программы, а тут мы заведомо строим домик без кирпичиков.
мне не знаком термин "концепсия"

в случае, если конструктор объекта успешно завершился,
сам объект находится в валидном (консистентном состоянии).

его логическое состояние при этом - дело десятое, и зависит от конкретного класса,
его цели и назначения.

в частности, приведенный мною выше паттерн
активно используется в механнизмах-обертках,
таких, как смарт-поинтеры, optional. и тп.

что касается уместности применения паттерна конкретно в данном случае:

качественный код - инвариантен.
что означает, что стабильность его работы не зависит от корректности вызывающей стороны.

есть только один способ обеспечить инвариант:
каждый конструктор, каждая функция,
каждая загогулинка на собственном уровне
в обязательной порядке валидирует все входящие аргументы.

в случае обнаружения каких либо неисправностей,
вызываемая сторона обязана не допустить краш на собственной территории,
и предупредить программистов о факте неисправности.


в случае с бустовскими смартами, стоят ассерт проверки
на валидность ресурса смарта
при любых операциях доступа к нему, например.

другим способом ещё более надежной защиты является механизм исключений.
однако ТС явным образом подчеркнул,
что его интересуют альтернативные техники.
1
20.12.2015, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2015, 21:22
Помогаю со студенческими работами здесь

Delphi, защита от некорректных действий пользователя, не работает
Начали изучать Delphi таким образом: набираем код из распечаточки с комментами... и смотрим.....

Триггер. Защита от добавления некорректных значений в таблицу
Есть триггер. Есть две таблицы. Нужно сделать так чтобы нельзя было ввести в поля таблицы ...

Запрет на ввод некорректных данных
Как сделать так чтоб если пользователь не заполнил какое то поле тогда программа бы просила это...

GUI: Проверка на ввод некорректных данных
как сделать чтобы в поле edit можно было вводить только числовые значения? при вводи букв и т.п....

Обработку исключений при вводе некорректных данных
#include &lt;iostream&gt; #include &lt;signal.h&gt; using namespace std; class Student{public: string...

Не возвращает фокус элементу при некорректных данных
По событиям OnChange и onBeforeDeactivate выполняется функция вида: sub control_input_2(nam) ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru