Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2015, 07:01   #1
Discriptor
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 13
По умолчанию Возвращение объекта класса из i-го элемента массива

Доброго времени суток!

Помогите, пожалуйста, с выполнением задания лаб. работы.

Необходимо написать функцию, которая б возвращала объект класса из i-го элемента массива.
Перед этой функцией есть другая функция, которая заносит объект класса в i-й элемент массива:
Код:
void Group::PutPerson(int i, Person& map)

{

	if (i>= 0 && i < 10) p_array[i] = map;

			
}
Group - созданный класс,
Person& map - объект класса типа Karta (другого созданного класса)
p_array - указатель на динамический массив объектов

Последний раз редактировалось Discriptor; 25.09.2015 в 07:04.
Discriptor вне форума Ответить с цитированием
Старый 25.09.2015, 08:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
Person Group::GetPerson(int i){	 return (i>= 0 && i < 10)?map:NULL;}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.09.2015, 09:40   #3
Discriptor
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 13
По умолчанию

Ребята, спасибо, нашел решение:
Код:
Person& Group::GetPerson(int i) 
 {
    if ((i < 0) || (9 < i)) 
        
    return p_array[i];
}
Может кому надо)), это задание, по объектно-ориентированному программированию, лабораторная ТУСУРа.
Discriptor вне форума Ответить с цитированием
Старый 25.09.2015, 09:53   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Тогда задам и на этом форуме тот же вопрос.
Какой толк от такого условия? Поменять одно UB на другое?
Croessmah вне форума Ответить с цитированием
Старый 25.09.2015, 10:23   #5
Discriptor
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 13
По умолчанию

ну, у меня компилятор выдал ошибку в варианте:
Код:
throw(std::out_of_range) {
    if ((i < 0) || (9 < i)) {
        throw std::out_of_range("[0,10)");
    }
    return p_array[i];
убрал использование range, ошибки исчезли. не будет работать в конечном итоге итоге, когда будет вызываться с main()?
а такой вариант будет работать?:
Код:
{
    if (i>= 0 && i < 10) 
        
    return p_array[i];
}
а такой:
Код:
Person& Group::GetPerson(int i) 
 {
    for (i= 0; i < 10; i++) 
	{
        
    return p_array[i];
	}
}
компилится без ошибок
ток, как и в первом случае, с предупреждением: warning C4715: 'Group::GetPerson' : not all control paths return a value
Ругается именно на последнею строку тела функции

Последний раз редактировалось Discriptor; 25.09.2015 в 10:32.
Discriptor вне форума Ответить с цитированием
Старый 25.09.2015, 10:40   #6
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
компилится без ошибок
ток, как и в первом случае, с предупреждением: warning C4715: 'Group::GetPerson' : not all control paths return a value
Во-первых, в коде который с исключением, условие (i < 0) || (9 < i) будет true в случае "некорректного" индекса, поэтому будет сгенерировано исключение, у Вас же при таком же "некорректном" индексе получится возврат черт пойми чего.
Ну ок, рассмотрим пару случаев
Код:
Person& Group::GetPerson(int i) 
 {
    //i у нас равен 8, значит 
    if ((i < 0) || (9 < i)) //8<0 || 9<8 == false || false == false
       return p_array[i]; //Значит сюда не попадем, хотя индекс "корректный"
   //Что вернется из функции?
}
Код:
Person& Group::GetPerson(int i) 
 {
    //i у нас равен -5, значит 
    if ((i < 0) || (9 < i)) //-5<0 || 9<-5 == true || false == true
       return p_array[i]; //Значит сюда попадем и вернем ссылку на p_array[-5]
}
Нормально, да?
Но даже, если переделать условие на обратное !((i < 0) || (9 < i)), то это не даст эффекта, смотрим почему.
Код:
Person& Group::GetPerson(int i) 
 {
    //i у нас равен -5, значит 
    if (!((i < 0) || (9 < i))) //!(-5<0 || 9<-5) == !(true || false) == !(true) == false
       return p_array[i]; //Значит сюда не попадем
    //Внимание вопрос! Что вернется из функции? 
    //Вариант с исключением решал эту проблему
    //Вариант Stilet также решает проблему, если есть некое,
    //заведомо невалидное (и с соответствующим временем хранения) значение объекта Person
}
Цитата:
у меня компилятор выдал ошибку в варианте
какую и где? Что за квадратный вакуум в сферическом коне?

Последний раз редактировалось Croessmah; 25.09.2015 в 10:43.
Croessmah вне форума Ответить с цитированием
Старый 25.09.2015, 10:51   #7
Discriptor
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 13
По умолчанию

компилятор выдал 4 ошибки:
error C2653: 'std' : is not a class or namespace name
error C2146: syntax error : missing ')' before identifier 'out_of_range'
error C2146: syntax error : missing ';' before identifier 'out_of_range'
fatal error C1004: unexpected end of file found

в варианте:
Код:
Person& Group::GetPerson(int i) throw(std::out_of_range) {
    if ((i < 0) || (9 < i)) {
        throw std::out_of_range("[0,10)");
    }
    return p_array[i];
}
Discriptor вне форума Ответить с цитированием
Старый 25.09.2015, 10:57   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
#include <stdexcept>
и какой компилятор?
Croessmah вне форума Ответить с цитированием
Старый 25.09.2015, 10:59   #9
Discriptor
Пользователь
 
Регистрация: 21.09.2015
Сообщений: 13
По умолчанию

Компилятор Microsoft Visual c++ 6.0
Discriptor вне форума Ответить с цитированием
Старый 25.09.2015, 11:02   #10
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Компилятор Microsoft Visual c++ 6.0
старый и поддерживающий не все возможности. Даже не возьмусь пилить под него код, ибо давно уже его не видел, и не помню что там он поддерживает, а что нет.

Скорее всего, у него вся стандартная библиотека валяется в глобальном пространстве, а не в std

Последний раз редактировалось Croessmah; 25.09.2015 в 11:06.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возвращение имени нажатого объекта Максим La Компоненты Delphi 3 09.07.2013 12:01
возвращение экзэипляра объекта из функции(дружественной, к примеру) monolit111 Общие вопросы C/C++ 2 06.10.2012 21:21
Инициализация элемента массива класса VmanMaslov Общие вопросы C/C++ 10 15.02.2012 20:57
роблема с созданием объекта динамического массива Класса GDA230105 C++ Builder 3 26.07.2011 09:25
Возвращение объекта из функции класса atenon Общие вопросы C/C++ 9 19.05.2010 03:24