Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:
1. Надо создать дерево. Делаю так:
class Folder {
..........
Folder& parent;
..........
}
на что компилятор матерится что нельзя использовать класс рекурсивно... А как?
2. NULL.
пример:
Folder getFolder(int id) {
if (...) {
return ...;
} else {
return NULL;
}
}
говорит что не может кастовать из int в Folder. А как?
Здравствуйте, hal, Вы писали:
hal>Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:
hal>1. Надо создать дерево. Делаю так:
hal>>Наверное Java развращает S>В яве просто везде неявно указатели используются.
Да, я в курсе, там многое делается проще и прозрачнее...
Re[3]: Рекурсивное использование класса
От:
Аноним
Дата:
20.12.04 13:59
Оценка:
Здравствуйте, hal, Вы писали:
hal>>>Наверное Java развращает S>>В яве просто везде неявно указатели используются.
hal>Да, я в курсе, там многое делается проще и прозрачнее...
Ага, голимые преобразования целых к указателям очень прозрачны
Здравствуйте, hal, Вы писали:
hal>Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:
hal>1. Надо создать дерево. Делаю так: hal>class Folder { hal> .......... hal> Folder& parent; hal> .......... hal>} hal>на что компилятор матерится что нельзя использовать класс рекурсивно... А как?
Либо глюк твоего компилятора, либо ты приводишь неправильный код. Если ты действительно используешь ссылку, то никакого рекурсивного использования в твоем коде нет и компилятор ни о чем ругаться не должен.
Подозреваю, что дело не в компиляторе, а в том, что реально в своем коде ты явно включил класс сам в себя, а здесь пишешь будто использовал ссылку...
Здравствуйте, hal, Вы писали:
hal>Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:
hal>1. Надо создать дерево. Делаю так: hal>class Folder { hal> .......... hal> Folder& parent; hal> .......... hal>} hal>на что компилятор матерится что нельзя использовать класс рекурсивно... А как?
тут все правильно, и это должно правильно компилиться
hal>2. NULL. hal>пример: hal>Folder getFolder(int id) { hal> if (...) { hal> return ...; hal> } else { hal> return NULL; hal> } hal>} hal>говорит что не может кастовать из int в Folder. А как?
ну ясный пень!!! тыже пытаешься вернуть из функции объект (типа Folder) по значению (судя по объявлению функции), а вместо этого возвращаешь просто 0 (NULL это и есть просто 0 т.е. int) вот компилятор и орет.
Пиши так
Folder * getFolder(int id)
{
if (...)
{
return ...; // ну например new Folder;
}
else
return NULL; // или просто 0
}
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Либо глюк твоего компилятора, либо ты приводишь неправильный код. Если ты действительно используешь ссылку, то никакого рекурсивного использования в твоем коде нет и компилятор ни о чем ругаться не должен.
АТ>Подозреваю, что дело не в компиляторе, а в том, что реально в своем коде ты явно включил класс сам в себя, а здесь пишешь будто использовал ссылку...
Код уже переписан, потому не могу дать его... Если коротко то было так:
class FotoFolder
{
public:
FotoFolder(void);
~FotoFolder(void);
private:
FotoFolder& m_parent;
};
и это не компилилось в Visual C++ 7.0... по совету было исправлено на:
class FotoFolder
{
public:
FotoFolder(void);
~FotoFolder(void);
private:
FotoFolder* m_parent;
};
и все заработало... Честно говоря я эти ссылки "&" почти не юзал, и юзал ОЧЕНЬ давно, так что я просто забыл что это, а читать лень
И правильно не компилилось. Только не компилировалось оно не из-за
использования не полностью определенного класса ("рекурсивного"), а потому
что ссылку инициализировать обязательно.
S>И правильно не компилилось. Только не компилировалось оно не из-за S>использования не полностью определенного класса ("рекурсивного"), а потому S>что ссылку инициализировать обязательно.
S>Вот такое бы вполне скомпилялось: S>
Здравствуйте, hal, Вы писали:
hal>Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:
hal>1. Надо создать дерево. Делаю так: hal>class Folder { hal> .......... hal> Folder& parent; hal> .......... hal>} hal>на что компилятор матерится что нельзя использовать класс рекурсивно... А как?
Все правильно ссылку на Folder он не создаст так как компилер не знает размера класса , попробуй указатель
............
Folder * parent;
............
hal>2. NULL. hal>пример:
hal>Folder getFolder(int id) { hal> if (...) { hal> return ...; hal> } else { hal> return NULL; hal> } hal>} hal>говорит что не может кастовать из int в Folder. А как?
hal>Наверное Java развращает
Опять таки NULL преобразует в инт а как инт преобразовать в Folder — не понятно , если хочешь использовать NULL
возращай указатель на класс — Folder * getFolder(int id)
Здравствуйте, hal, Вы писали:
АТ>>Либо глюк твоего компилятора, либо ты приводишь неправильный код. Если ты действительно используешь ссылку, то никакого рекурсивного использования в твоем коде нет и компилятор ни о чем ругаться не должен.
АТ>>Подозреваю, что дело не в компиляторе, а в том, что реально в своем коде ты явно включил класс сам в себя, а здесь пишешь будто использовал ссылку...
hal>Код уже переписан, потому не могу дать его... Если коротко то было так: hal>
Да, но в своем исходном сообщении ты сказал, что "компилятор матерится что нельзя использовать класс рекурсивно". Я не понимаю, почему в ответ на такой код компилятор друг станет "материться" именно на тему рекурсивного использования, ибо никакого рекурсивного использования здесь и близко нет. Мне, например, такие компиляторы неизвестны.
Нормальный С++ компилятор сообщит об отсутствии иницализатора для ссылки. Но это уже совсем другая проблема, ни к какой рекурсивности никакого отношения не имеющая.
Best regards,
Андрей Тарасевич
Re[4]: Рекурсивное использование класса
От:
Аноним
Дата:
22.12.04 18:12
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:
Прошу прощения за офтопик. Андрей Тарасевич немогли бы ва написать свой электронный адрес. Или выслать его на адрес yakubouski@mail.by
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Да, но в своем исходном сообщении ты сказал, что "компилятор матерится что нельзя использовать класс рекурсивно". Я не понимаю, почему в ответ на такой код компилятор друг станет "материться" именно на тему рекурсивного использования, ибо никакого рекурсивного использования здесь и близко нет. Мне, например, такие компиляторы неизвестны.
АТ>Нормальный С++ компилятор сообщит об отсутствии иницализатора для ссылки. Но это уже совсем другая проблема, ни к какой рекурсивности никакого отношения не имеющая.
Согласен... Провел "эксперимент", действительно ругается на отсутствие инициализации... Но я четко помню что было сообщение об ошибке связанное с рекурсией... К сожалению у меня не осталось того кода который вызывал эту ошибку... Главное я понял что в моем случае надо использовать указатели, а не ссылки... И понял что такое NULL