Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1557
∙ повысить рейтинг »
_Ayl_
Статус: Студент
Рейтинг: 1428
∙ повысить рейтинг »
Micren
Статус: Специалист
Рейтинг: 1403
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1461
Дата выхода:30.12.2009, 23:00
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:678 / 182
Вопросов / ответов:1 / 1
IRC-канал по теме:#C

Вопрос № 175598: Здравствуйте уважаемые эксперты! Помогите пожалуйста: необходимо разработать подпрограмму, возвращающую количество объектов, находящихся в области видимости. Заранее благодарен....



Вопрос № 175598:

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

Отправлен: 25.12.2009, 05:44
Вопрос задал: Мих@ил, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Micren, Специалист :
Здравствуйте, Мих@ил.
© Цитата: Мих@ил
Объектом насколько я понял будет массив (arr), находящихся в области видимости - количество этих массивов (предполагается что созданных массивов может быть несколько).

Код:
#include <iostream>
#include <cstring>
#include <stdexcept>

using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::out_of_range;

// Шаблонный класс-массив
template<class T>
class arr ay
{
public:
// Используемые типы
typedef int index_type;
typedef unsigned int size_type;
// Конструкторы
explicit array(size_type length = 10);
array(index_type lo, size_type length);
array(const array<T>& arr);
virtual ~array();
// Оператор присваивания
const array<T> & operator=(const array<T>& arr);
// Возвращает минимальный индекс
index_type lo() const;
// Возвращает максимальный индекс
index_type hi() const;
// Возвращает размер
size_type length() const;
// Индексаторы
T & operator[](index_type index);
const T & operator[](index_type index) const;
static size_t count();
private:
static size_t _count;
// Мин. индекс
index_type _lo;
// Длина
size_type _length;
// Данные
T* _data;
template<class Ty> friend array<Ty> operator*(const array<Ty>& arr, Ty val);
template<class Ty> friend array<Ty> operator+( const array<Ty>& arr, Ty val);
};

template<class T> size_t array<T>::_count=0;

// Требуемые операторы
template<class Ty> array<Ty> operator*(const array<Ty>& arr, Ty val);
template<class Ty> array<Ty> operator*(Ty val, const array<Ty>& arr);
template<class Ty> array<Ty> operator+(const array<Ty>& arr, Ty val);
template<class Ty> array<Ty> operator+(Ty val, const array<Ty>& arr);

template<class T> ostream& operator<<(ostream& stream, const array<T>& arr);

typedef array<int> int_array;

int main()
{
// Создаем массив из 20 элементов с первым индексом -10
int_array arr(-10, 20);
for (array<int>::index_type i = arr.lo(), end = i + arr.length(); i < end; ++i)
{
arr[i] = i;
}
cout << "lo:" << arr.lo() << endl
<< "hi:" << arr.h i() << endl
<< "length:" << arr.length() << endl;
cout << "Array:" << arr << endl;
cout << "Array*10:" << 10 * arr << endl;
cout << "Array+10:" << 10 + arr << endl;
cout<<"Count:"<<int_array::count()<<endl;
{
int_array b(arr);
cout<<"Count:"<<int_array::count()<<endl;
}
cout<<"Count:"<<int_array::count()<<endl;

return 0;
}

// Оператор вывода для массива
template<class T>
ostream& operator<<(ostream& stream, const array<T>& arr)
{
for (typename array<T>::index_type i = arr.lo(), end = i + arr.length(); i < end; ++i)
{
stream << arr[i] << ' ';
}
return stream;
}

template<class T>
array<T>:: array(typename array<T>::size_type length)
: _lo(1)
, _length(length)
, _data(new T[length]())
{
++_count;
}
< br>template<class T>
array<T>::array(index_type lo, size_type length)
: _lo(lo)
, _length(length)
, _data(new T[length]())
{
++_count;
}

// Оператор копирования
template<class T>
array<T>::array(const array<T>& arr)
: _lo(arr._lo) // Копируем нижний индекс
, _length(arr._length) // Копируем длину массива
, _data(new T[arr._length]()) // Создадим массив с такой же длиной
{
// Копируем данные
memcpy(_data, arr._data, _length * sizeof (T));
++_count;
}

template<class T>
array<T>::~array()
{
if(_data)
{
delete[] _data;
_data=0;
--_count;
}
}

template<class T>
const array<T>& array<T>::operator=(const array<T>& arr)
{
if (this != &arr)
{
delete[] _data;
_data=new T[_length = arr._length]();
_lo = arr._lo;
memcpy(_data, arr._data, _le ngth * sizeof (T));
++_count;
}
return *this;
}

template<class T>
typename array<T>::index_type array<T>::lo() const
{
return _lo;
}

template<class T>
typename array<T>::index_type array<T>::hi() const
{
return _lo - 1 + _length;
}

template<class T>
typename array<T>::size_type array<T>::length() const
{
return _length;
}

template<class T>
T& array<T>::operator[](index_type index)
{
if ((index -= _lo) < _length)
{
return *(_data + index);
}
else throw out_of_range("Index out of bounds");
}

template<class T>
const T& array<T>::operator[](index_type index) const
{
if ((index -= _lo) < _length)
{
return *(_data + index);
}
else throw out_of_range("Index out of bounds");
}

template<class T>
size_t array<T>:: count()
{
return _count;
}

// Оператор умножения массива на значение
template<class Ty>
array<Ty> operator*(const array<Ty>& arr, Ty val)
{

// Копируем массив в result
array<Ty> result = arr;
// Получим указатель на начало данных
Ty* cur = result._data;
// Указатель на конец данных
const Ty * const end = cur + arr._length;
// Перебираем данные
while (cur != end)
{
// Умножаем каждый элемент и сдвигаем указатель на следующий
*cur++ *= val;
}
return result;
}

template<class Ty>
array<Ty> operator*(Ty val, const array<Ty>& arr)
{
return arr*val;
}

template<class Ty>
array<Ty> operator+(const array<Ty>& arr, Ty val)
{
array<Ty> result = arr;
Ty* cur = result._data;
const Ty * const end = cur + arr._length;
while (cur != end)
{
*cur++ += val;
}
return result;
}< br>
template<class Ty>
array<Ty> operator+(Ty val, const array<Ty>& arr)
{
return arr + val;
}

Код:
lo:-10
hi:9
length:20
Array:-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
Array*10:-100 -90 -80 -70 -60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90
Array+10:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Count:1
Count:2
Count:1

Ответ отправил: Micren, Специалист
Ответ отправлен: 25.12.2009, 11:45

Оценка ответа: 5

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 258116 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.13 от 28.12.2009

    В избранное