Arct
Участник
Offline
Пол:
Злое
|
|
« : 27-05-2006 07:21 » |
|
Функция возвращает ссылку, а как возвратить сообщение об ошибке? Вроде что то читал про пустые ссылки, а что и где вспомнить не могу...
|
|
« Последнее редактирование: 27-05-2006 18:46 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 27-05-2006 07:35 » |
|
В зависимости от языка программирования. В С++ константа пустой ссылки NULL. В Паскале nil.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #2 : 27-05-2006 18:45 » |
|
C++. Это public функция шаблонного класса, тип ссылки неизвестен зарание. NULL уже пробовал компилятор ругается: Attempting to return a reference to a local object Я так понял, что-то на тему того, что переменная временая и возращать её нельзя. template <class T> const T & MyStack<T>::TOP() const { if(tos==257) return mystack[256]; // if(tos==-1) // return ; return mystack[tos];
|
|
« Последнее редактирование: 27-05-2006 18:48 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #3 : 27-05-2006 19:23 » |
|
Arct, У тебя тут не совсем указатель. Я сейчас поэксперементировал у себя. С самой функции уходит указатель на внутрение переменные. Но затем преобразуется в значение переменной. Поэтому применять NULL некоректно. Надо найти другой способ, обозначить ошибочность данных.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 27-05-2006 19:35 » |
|
а если так - передавать ссылку внутрь функции f(int& n) { n=0; }
main() { int n; f(n); if(!n) { } }
|
|
« Последнее редактирование: 28-05-2006 16:16 от Алексей1153 »
|
Записан
|
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #5 : 28-05-2006 16:31 » |
|
А если сначала в привате класса объявить указатель и инициализировать его NULL'ом, а потом его возвращать? template<class T> class MyStack { T *NPtr; ... public: MyStack(){NPtr=NULL;} const T &TOP()const; }; ... template <class T> const T & MyStack<T>::TOP() const { if(tos==257) return mystack[256]; if(tos==-1) return *NPtr; return mystack[tos]; }
Вроде все нормально, но что-то мне не нравится. Я где-то ошибся?
|
|
« Последнее редактирование: 19-12-2007 21:35 от Алексей1153++ »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #6 : 28-05-2006 18:12 » |
|
Он тебе ошибку не выдает? Ты пытаешся отдать значение по NULL ссылке. Должна выскочить ошибка доступа. Раскажи, что в конечном счете ты хочеш получить. И как использовать данный метод? Тогда отсюда можно уже думать думу .
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #7 : 29-05-2006 01:48 » |
|
Простой стек, функция POP() возвращает указатель на верщину стека, но она должа что-то возвращать если стек пуст.Пока ничего умнее, чем перед вызовом проверять это отдельной функцией не придумал. Хотелось бы, чтоб без лишних вызовов.
|
|
« Последнее редактирование: 29-05-2006 01:53 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 29-05-2006 08:09 » |
|
bool POP(mytype* pMT);
|
|
|
Записан
|
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #9 : 29-05-2006 12:56 » |
|
Алексей1153 bool POP(mytype* pMT);
Функция должна возвращать ссылку, не булеву переменную. И причем здесь РОР() Функция TOP() НЕ извлекает элемента, а только ссылочку возвращает. Или ты, чот-то другое подразумеваешь. Поясни пожалуста.
|
|
« Последнее редактирование: 29-05-2006 13:09 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 29-05-2006 15:33 » |
|
Arct, ух блин. в шаблонах я не силён, но какая тут разница: bool POP(mytype* pMT) { if(!stack_counter)return false; *pMT=stack[--stack_counter]; return true; } main() { //извлекаем mytype MT; if(POP(&MT)) { //работаем с MT } }
|
|
|
Записан
|
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #11 : 29-05-2006 17:40 » |
|
Алексей1153Пока ничего умнее, чем перед вызовом проверять это отдельной функцией не придумал. Хотелось бы, чтоб без лишних вызовов.
|
|
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 29-05-2006 17:50 » |
|
Arct, а как без этого? Ты извлекаешь из стека элемент. Чтобы узнать, что стек пуст, ты УЖЕ должен что-то проверить. А тут у меня и нету отдельной функции... И ты на калькуляторе собрался выполнять прогу что ли? проверить один байт на ноль долго?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 29-05-2006 18:03 » |
|
Я могу предложить сделать так. Правда при моём вызове У тебя нельзя будет подцепить в паравоз вызовов. template <class T> T * MyStack<T>::TOP() { if(tos==257) return &mystack[256]; if(tos==-1) return NULL; return &mystack[tos]; }
Возрат будет ссылка, а не значение. Тебе останется проверить ссылку на NULL.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #14 : 30-05-2006 01:16 » |
|
Пробовал, и как раз на return NULL; компилятор и ругается. А зачем адрес массива получать он же и так указатель или я опять торможу
|
|
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 30-05-2006 08:35 » |
|
Arct, а как он ругается?
попробуй так return ((T *)NULL);
|
|
|
Записан
|
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #16 : 30-05-2006 13:12 » |
|
Ругается Error ..\111\STECK1.CPP 78: Attempting to return a reference to a local object
Попытка вернуть ссылку на местный объект, как я понял. А правда у меня же тут ссылка, а не указатель. Так... Ссылке же нельзя присвоеть значение явно, так? Значет всё таки template<class T> class MyStack { T *NPtr; ... public: MyStack(){NPtr=NULL;} const T &TOP()const; }; ... template <class T> const T & MyStack<T>::TOP() const { if(tos==257) return mystack[256]; if(tos==-1) return *NPtr; return mystack[tos]; } правильно? Ушёл в цикл...(мозг)
|
|
« Последнее редактирование: 30-05-2006 13:17 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 30-05-2006 14:45 » |
|
правильно, но долго а чем указатели не устраивают??? это же быстрее и гибче
|
|
|
Записан
|
|
|
|
Arct
Участник
Offline
Пол:
Злое
|
|
« Ответ #18 : 31-05-2006 01:31 » |
|
Просто поступил по контексту... Нужен стек - открыл справочник по С++ Шилдта, посмотрел в стандартной библлиотеке шаблонов, а там это функция ссылку возврощает. Ну и начал реализововать. А в принцепе пофиг, главное понять откуда уши проблеммы торчат, что и было достигнуто. Всем спасибо.
|
|
« Последнее редактирование: 31-05-2006 01:36 от Arct »
|
Записан
|
Пройди свой путь, ты не сумеешь назад всё вернуть...
|
|
|
|