С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
kniazik
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 25
#1

Вопрос по исключениям в шаблонах классов - C++

10.06.2011, 20:56. Просмотров 1415. Ответов 21
Метки нет (Все метки)

Кто подскажет как реализовать исключения в следующей задаче:

Создать шаблонный класс, в котором создать одномерный массив и найти сумму элементов от n до m.

Не могу понять как это сделать, кто может подсказать - буду благодарен, заранее СПАСИБО.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2011, 20:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос по исключениям в шаблонах классов (C++):

Посоветуйте сайт или книгу где хорошо изложена информация о ШАБЛОНАХ КЛАССОВ - C++
Посоветуйте сайт или книгу где хорошо изложена информация о ШАБЛОНАХ КЛАССОВ До этого читал: 1) С.Прата "Язык программирования...

Вопрос про утилизацию классов - C++
Как выполнить утилизацию класса? Допустим я написал код прототипа класса(интерфейс) и код определения класса. Теперь надо очереди...

Вопрос. Чем отличаются структуры в С++ от классов в C++ - C++
Приветствую. Никак не могу понять чем же все таки отличаются структуры от классов, кроме того что в структуре по умолчанию все члены...

Дружественные функции в шаблонах - C++
Как использовать дружественные функции в шаблонах? ( C++ Builder)

ошибка в шаблонах функций - C++
Есть у меня программа из нескольких файлов . с шаблонами для функций ... компилятор выдает следующий ошибку -> "/main.cpp:17: undefined...

Typename в шаблонах класса - C++
В таком шаблоне: template <typename T, int n, bool islong=???> class CounterA{... требуется распознать тип, то есть переменная islong...

21
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.06.2011, 00:12 #16
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот вам инфа про динамические объекты:

Классы (non-Pod типы)
Любой класс, не удовлетворяющий перечисленным выше условиям , является non-POD типом. Стандарт определяет, что создание динамического non-POD объекта операцией new выполняется в два этапа:
1. Для объекта выделяется необходимое количество свободной памяти.
2. Вызывается конструктор, чтобы проинициализировать выделенную память.

Время жизни динамических non-POD объектов начинается только с момента окончания работы конструктора. Первый шаг для одиночного объекта выполняется функцией выделения памяти operator new(), и функцией operator new[]() — для массива объектов. В стандарте [1 3.7.3, 18.4] эти функции определены так:
C++
1
2
void *operator new(std::size_t size) throw(std::bad_alloc);
void *operator new[](std::size_t size) throw(std::bad_alloc);
Отметим, что при невозможности выделить память конструктор не вызывается. Более того, пункт стандарта 5.3.4/17 гласит, что в случае возникновения исключения во время инициализации объекта сначала выполняется возврат выделенной памяти, а затем начинается обработка исключения. Таким образом, механизм new/delete еще и значительно более надежен и безопасен по сравнению с механизмом malloc()/free().

Уничтожение динамического объекта тоже выполняется в два шага: сначала вызывается деструктор, а затем функция возврата памяти. Время жизни динамического объекта заканчивается, когда начинается выполнение кода деструктора. Функции возврата памяти определены в стандарте там же, где и функции выделения памяти, и имеют следующие прототипы:
C++
1
2
void operator delete (void *) throw();
void operator delete [](void *) throw();
Как и показанное выше создание динамических POD-объектов, динамический объект произвольного класса можно создать без инициализации.
C++
1
2
Type *p1 = new Type;                
Type *p2 = new Type();
При наличии в классе определенного конструктора без аргументов в данном случае после выделения памяти вызывается именно он. Кроме того, мы можем инициализировать динамические объекты (аналогично объектам встроенных типов), если в классе определен конструктор инициализации.

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

Создание динамических объектов-констант ничем не отличается от создания динамических констант встроенных типов. Конечно, даже динамически создаваемую константу требуется инициализировать (для этого в классе должен быть определен конструктор инициализации), однако и Visual C++.NET 2003, и C++ Builder 6 «пропускают» отсутствие инициализации. Например, без всяких сообщений транслируется такое объявление
C++
1
const Type *p1 = new const Type;
Естественно, в этом случае во время выполнения вызывается конструктор без аргументов.

Операция delete осуществляет уничтожение динамических объектов: сначала вызывается деструктор, а затем возвращается память. Возврат памяти выполняется функцией operator delete() для одиночного объекта и для массива — функцией operator delete[](). Как мы уже знаем, эти функции не генерируют исключений. Это гарантирует, что операция уничтожения объекта не преподносит никаких сюрпризов — ведь деструктор тоже не должен генерировать исключений. При уничтожении массива деструктор вызывается для каждого элемента удаляемого массива.

Добавлено через 2 минуты
Цитата Сообщение от OstapBender Посмотреть сообщение
хехехе) ну так ваш ob создается и существует только в блоке try...
Вот тебе и с динамическим:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{   a *pa;
    try {
          a ob(5);
          pa = new a(-5);
        } catch(int) {
                std::cout << "Bad alloc\n";
        }
        system("pause");
                return 0;
}
4
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 00:20 #17
спасибо большинство из этого знал, а вот этого не знал
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Отметим, что при невозможности выделить память конструктор не вызывается. Более того, пункт стандарта 5.3.4/17 гласит, что в случае возникновения исключения во время инициализации объекта сначала выполняется возврат выделенной памяти, а затем начинается обработка исключения. Таким образом, механизм new/delete еще и значительно более надежен и безопасен по сравнению с механизмом malloc()/free().

но где в примере в конце
delete pa; ??????
0
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.06.2011, 08:19 #18
Цитата Сообщение от OstapBender Посмотреть сообщение
спасибо большинство из этого знал, а вот этого не знал



но где в примере в конце
delete pa; ??????
Программка маленькая. При завершении система обратно все вернет. Нету вложенности, чтоб указатели терялись.
Хотя я просто забыл... )
0
kniazik
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 25
12.06.2011, 14:44  [ТС] #19
Всем большое спасибо, но как реализовать исключения в моей задаче?

Вот - именно в моей? В конструкторе ?

И как лучше - может быть создать класс исключений? Тогда какой ? как учитывать хотя бы самое простое - N>M. В книге очень туго все написано. СПАСИБО

Добавлено через 18 часов 21 минуту
Ребята, помогите решить .. ну не шарю я в этом.

Добавлено через 1 час 7 минут
может кого материально заинтересует, сегодня точно нужно решить
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.06.2011, 14:56 #20
пишу не из дома в блокноте
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
54
55
template <class T>
class Array1D {
 
T* data;
int sz; 
 
public:
 
Array1D():data(0),n(0) {}
Array1D(int s):n(s) { data = new T[n]; }
~Array1D() { delete[] data; }
T sumNM(int n, int m) {
T sum=0;
try {
if (n>m || m>sz || n<0) throw -1;
 
for (int i=n; i<m; i++)
sum+=data[i];
 
} catch(int e) {
return e;
}
 
return sum;
 
 
 
}
 
 
};
 
 
int main()
{
Array1D<int> arr(10);
int sum;
 
try {
 
sum=arr.sumNM(-4,5);
 
if (sum==-1) throw 0;
std::cout << "sum n-m = " << sum << '\n';
 
} catch(int) {
std::cout << "bad sum\n";
}
 
 
 
 
return 0;
 
}
1
silent_1991
12.06.2011, 15:07
  #21
 Комментарий модератора 
kniazik, за дубли буду наказывать.
0
kniazik
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 25
12.06.2011, 15:19  [ТС] #22
D:\work\ef\ewd.cpp(18) : error C2614: 'Array1D<int>' : illegal member initialization: 'n' is not a base or member
D:\work\ef\ewd.cpp(18) : while compiling class-template member function '__thiscall Array1D<int>::Array1D<int>(int)'
D:\work\ef\ewd.cpp(18) : error C2065: 'n' : undeclared identifier
D:\work\ef\ewd.cpp(18) : while compiling class-template member function '__thiscall Array1D<int>::Array1D<int>(int)'
Error executing cl.exe.

ef.exe - 2 error(s), 0 warning(s)


Материально отблагодарю
0
12.06.2011, 15:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2011, 15:19
Привет! Вот еще темы с ответами:

Подстановка вычисляемого типа в шаблонах - C++
Товарищи. Помогите разобраться с шаблонами. С шаблонами начал разбираться вчера, и потому излагаю задачу полностью, дабы не быть...

Тип, зависимый от условия в шаблонах - C++
Возможно ли реализовать подобное: template &lt;uint8_t bits&gt; class test { // если bits &lt;= 8 typedef uint8_t storageType; //...

Доступ к элементам tuple в шаблонах - C++
Собственно, не могу понять как работать с элементами кортежа в цикле, не получается получить к ним доступ. Подскажите, кто знает, как это...

Стек на шаблонах - оцените реализацию - C++
просто хочу узнать чужое мнение, написал стек через шаблоны, оцените реализацию :) template &lt;typename T&gt; class Stack { private: ...


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

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

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