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

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

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

Как проверять и тестировать входные аргументы конструктора? - C++

24.04.2014, 15:48. Просмотров 232. Ответов 1
Метки нет (Все метки)

Подскажите, пожалуйста, как проверять и тестировать входные аргументы конструктора?

Пусть есть некоторый класс. И в конструкторе один входной аргумент - строка. Я делаю так:
в конструкторе проверяю, если строка не корректная, я кидаю исключение std::invalid_argument("").

Когда я тестирую я создаю штук 15 объектов, которым передаю в конструкторе разные строки. Если какая-то
строка некорректная, я отлавливаю исключение и проверяю должно ли оно было появиться на этой строке или нет.

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

Набросал примерный код.
Кликните здесь для просмотра всего текста
C++ (Qt)
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
54
55
#include <iostream>
#include <stdexcept>
#include <assert.h>
 
 
class SomeClass {
public:
    SomeClass(const std::string &line) {
        if (line[0] != 'a') {
            // ok
        }
        else
        {
            throw std::invalid_argument("The First character is 'a'! ");
        }
    }
};
 
 
class SomeClassTest {
public:
    void ConstructorTest() {
        bool hasErrorBeen = false;
        try
        {
            SomeClass object1("Hello");
        }
        catch(std::invalid_argument& error)
        {
            hasErrorBeen = true;
        }
        assert(hasErrorBeen == false);
 
        hasErrorBeen = false;
        try
        {
            SomeClass object2("aHello");
        }
        catch(std::invalid_argument& error)
        {
            hasErrorBeen = true;
        }
        assert(hasErrorBeen == true);
 
        // И тут еще 15 таких тестов
    }
};
 
int main() {
 
    SomeClassTest someClassTest;
    someClassTest.ConstructorTest();
 
    return 0;
}


http://ideone.com/cK0b9b
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 15:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как проверять и тестировать входные аргументы конструктора? (C++):

Шаблонные аргументы конструктора std::unique_ptr - C++
Если я пишу код std::unique_ptr&lt;int, void(*)(int*)&gt; myPtr_5(new int, (int* p) {delete p; }); то все приятно, и компилируется без...

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать? - C++
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и какой плюс от использования перемещающего...

Разработать класс-контейнер. Как тестировать? - C++
задали курсовую работу. (ниже файл) но я не могу понять что нужно сделать? к какому результату нужно прийти? в методических указаниях...

Как сделать чтобы программа отображала входные параметры самостоятельно - C++
Всем привет! Нужно написать программу. В центре будет изображена 3д модель. а по бокам будет показаны входные данные, на которые...

Итераторы, как аргументы функции - C++
Код: #include &lt;iostream&gt; using std::cout; using std::cin; using std::endl; #include &lt;string&gt; using...

Как проверять в двумерном массиве только третий столбец на наличие определенных элементов? - C++
Всем привет ! Вот дан мне двумерный массив . Например 1 1 2 ...

1
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,137
24.04.2014, 16:27 #2
Почему бы не запихать все в один try-catch?
C++
1
2
3
4
5
6
7
8
9
10
11
try
{
   SomeClass c1("cool"), c2("0"), c3("qwerty") /*...*/;
   //SomeClass c[15] = {};
}
catch(std::invalid_argument e)
{
   std::cout << "Error occured in the constructor of some of the 15 objects" << endl;
   std::cin.get();
   exit(true);
}
А вообще кидать исключения из конструктора не запрещено, а даже иногда необходимо, т.к. конструктор не может вернуть код ошибки и кроме как выкинуть исключение путей нет. Деструкторы будут вызваны для сформировавшихся объектов при выбрасывании исключения. Ну и как вариант, что бы не кидать исключения, можно выводить ошибку прямо в конструкторе объекта, если что то пошло не так, и сразу exit().
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 16:27
Привет! Вот еще темы с ответами:

Как обработать аргументы коммандной строки? - C++
Я делаю вот так if (strcmp(argv,&quot;/?&quot;)==0) { puts(&quot;This my help&quot;); } if (strcmp(argv,&quot;/i&quot;)==0) { ...

Как добавить запятую в аргументы макроса? - C++
есть макрос который должен принимать строку в которой есть запятые как это сделать? void some_fun(const char * arg_1, unsigned int...

Аргументы шаблонного метода как объекты - C++
Не могу решить одну задачу. вот три класса class win {}; class obj1 {}; class obj2 {};

Как создать 3 конструктора? - C++
В классе есть 3 обекта однаковых типов как создать 3 конструктора каждый для своей переменной?


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

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

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