Рекурсивное использование класса
От: hal  
Дата: 20.12.04 12:33
Оценка:
Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:

1. Надо создать дерево. Делаю так:
class Folder {
..........
Folder& parent;
..........
}
на что компилятор матерится что нельзя использовать класс рекурсивно... А как?

2. NULL.
пример:
Folder getFolder(int id) {
if (...) {
return ...;
} else {
return NULL;
}
}
говорит что не может кастовать из int в Folder. А как?

Наверное Java развращает
Re: Рекурсивное использование класса
От: Аноним  
Дата: 20.12.04 12:35
Оценка:
Есть еще и указатели.

class Node
{
//
  Node * parent_;
//
};
Re[2]: Понял, торможу, спасибо :)
От: hal  
Дата: 20.12.04 12:44
Оценка:
Re: Рекурсивное использование класса
От: Bell Россия  
Дата: 20.12.04 12:53
Оценка:
Здравствуйте, hal, Вы писали:

hal>Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:


hal>1. Надо создать дерево. Делаю так:


hal>class Folder {
hal>  ..........
hal>  Folder& parent;
hal>  ..........
hal>}

hal>на что компилятор матерится что нельзя использовать класс рекурсивно... А как?
Например так:
class 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. А как?

Folder* getFolder(int id) {
  if (...) {
    return ...;
  } else {
    return NULL;
  }
}




hal>Наверное Java развращает
Любите книгу — источник знаний (с) М.Горький
Re: Рекурсивное использование класса
От: slegkapjan  
Дата: 20.12.04 13:19
Оценка:
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>Наверное Java развращает

В яве просто везде неявно указатели используются.
Re[2]: Рекурсивное использование класса
От: hal  
Дата: 20.12.04 13:54
Оценка:
hal>>Наверное Java развращает
S>В яве просто везде неявно указатели используются.

Да, я в курсе, там многое делается проще и прозрачнее...
Re[3]: Рекурсивное использование класса
От: Аноним  
Дата: 20.12.04 13:59
Оценка: :))
Здравствуйте, hal, Вы писали:

hal>>>Наверное Java развращает

S>>В яве просто везде неявно указатели используются.

hal>Да, я в курсе, там многое делается проще и прозрачнее...


Ага, голимые преобразования целых к указателям очень прозрачны
Re[4]: Рекурсивное использование класса
От: hal  
Дата: 20.12.04 14:04
Оценка:
hal>>Да, я в курсе, там многое делается проще и прозрачнее...

А>Ага, голимые преобразования целых к указателям очень прозрачны


Давайте не будем разводить флейм... Меня не интересует внутрення кухня JVM... Я говорю о написании кода
Re: Рекурсивное использование класса
От: Андрей Тарасевич Беларусь  
Дата: 20.12.04 16:50
Оценка:
Здравствуйте, hal, Вы писали:

hal>Давно не использовал C++, но надо... Столкнулся с некоторым количесвтом пробем:


hal>1. Надо создать дерево. Делаю так:

hal>class Folder {
hal> ..........
hal> Folder& parent;
hal> ..........
hal>}
hal>на что компилятор матерится что нельзя использовать класс рекурсивно... А как?

Либо глюк твоего компилятора, либо ты приводишь неправильный код. Если ты действительно используешь ссылку, то никакого рекурсивного использования в твоем коде нет и компилятор ни о чем ругаться не должен.

Подозреваю, что дело не в компиляторе, а в том, что реально в своем коде ты явно включил класс сам в себя, а здесь пишешь будто использовал ссылку...
Best regards,
Андрей Тарасевич
Re: Рекурсивное использование класса
От: Lapulya  
Дата: 20.12.04 17:14
Оценка:
Здравствуйте, 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
}
Re[2]: Рекурсивное использование класса
От: hal  
Дата: 22.12.04 11:58
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Либо глюк твоего компилятора, либо ты приводишь неправильный код. Если ты действительно используешь ссылку, то никакого рекурсивного использования в твоем коде нет и компилятор ни о чем ругаться не должен.


АТ>Подозреваю, что дело не в компиляторе, а в том, что реально в своем коде ты явно включил класс сам в себя, а здесь пишешь будто использовал ссылку...


Код уже переписан, потому не могу дать его... Если коротко то было так:
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;
};

и все заработало... Честно говоря я эти ссылки "&" почти не юзал, и юзал ОЧЕНЬ давно, так что я просто забыл что это, а читать лень
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[3]: Рекурсивное использование класса
От: Sergey Россия  
Дата: 22.12.04 13:23
Оценка:
Hello, hal!
You wrote on Wed, 22 Dec 2004 11:58:51 GMT:

h> Код уже переписан, потому не могу дать его... Если коротко то было так:

h>
 h> class FotoFolder
 h> {
 h> public:
 h>  FotoFolder(void);
 h>  ~FotoFolder(void);

 h> private:
 h>  FotoFolder& m_parent;
 h> };
 h>

h> и это не компилилось в Visual C++ 7.0...

И правильно не компилилось. Только не компилировалось оно не из-за
использования не полностью определенного класса ("рекурсивного"), а потому
что ссылку инициализировать обязательно.

Вот такое бы вполне скомпилялось:
class FotoFolder
{
public:
 FotoFolder(FotoFolder parent) : m_parent(parent) {}
 ~FotoFolder(void);

private:
 FotoFolder& m_parent;
};


With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 delta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Рекурсивное использование класса
От: hal  
Дата: 22.12.04 15:03
Оценка:
Здравствуйте, Sergey, Вы писали:


S>И правильно не компилилось. Только не компилировалось оно не из-за

S>использования не полностью определенного класса ("рекурсивного"), а потому
S>что ссылку инициализировать обязательно.

S>Вот такое бы вполне скомпилялось:

S>
S>class FotoFolder
S>{
S>public:
S> FotoFolder(FotoFolder parent) : m_parent(parent) {}
S> ~FotoFolder(void);

S>private:
S> FotoFolder& m_parent;
S>};
S>


Видать то был не мой день... потому как я делал что-то подобное:
class FotoFolder
{
public:
 FotoFolder() : m_parent(NULL) {}
 ~FotoFolder(void);

private:
 FotoFolder& m_parent;
};

наивно полагая что будет инициализирована ссылка NULL-ом... Java портит программиста
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re: Рекурсивное использование класса
От: ScorpZ Украина  
Дата: 22.12.04 17:44
Оценка:
Здравствуйте, 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)
Re[3]: Рекурсивное использование класса
От: Андрей Тарасевич Беларусь  
Дата: 22.12.04 18:04
Оценка:
Здравствуйте, hal, Вы писали:

АТ>>Либо глюк твоего компилятора, либо ты приводишь неправильный код. Если ты действительно используешь ссылку, то никакого рекурсивного использования в твоем коде нет и компилятор ни о чем ругаться не должен.


АТ>>Подозреваю, что дело не в компиляторе, а в том, что реально в своем коде ты явно включил класс сам в себя, а здесь пишешь будто использовал ссылку...


hal>Код уже переписан, потому не могу дать его... Если коротко то было так:

hal>
hal>class FotoFolder
hal>{
hal>public:
hal>    FotoFolder(void);
hal>    ~FotoFolder(void);

hal>private:
hal>    FotoFolder& m_parent;
hal>};
hal>



Да, но в своем исходном сообщении ты сказал, что "компилятор матерится что нельзя использовать класс рекурсивно". Я не понимаю, почему в ответ на такой код компилятор друг станет "материться" именно на тему рекурсивного использования, ибо никакого рекурсивного использования здесь и близко нет. Мне, например, такие компиляторы неизвестны.

Нормальный С++ компилятор сообщит об отсутствии иницализатора для ссылки. Но это уже совсем другая проблема, ни к какой рекурсивности никакого отношения не имеющая.
Best regards,
Андрей Тарасевич
Re[4]: Рекурсивное использование класса
От: Аноним  
Дата: 22.12.04 18:12
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

Прошу прощения за офтопик. Андрей Тарасевич немогли бы ва написать свой электронный адрес. Или выслать его на адрес yakubouski@mail.by
Re[4]: Рекурсивное использование класса
От: hal  
Дата: 23.12.04 07:49
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Да, но в своем исходном сообщении ты сказал, что "компилятор матерится что нельзя использовать класс рекурсивно". Я не понимаю, почему в ответ на такой код компилятор друг станет "материться" именно на тему рекурсивного использования, ибо никакого рекурсивного использования здесь и близко нет. Мне, например, такие компиляторы неизвестны.


АТ>Нормальный С++ компилятор сообщит об отсутствии иницализатора для ссылки. Но это уже совсем другая проблема, ни к какой рекурсивности никакого отношения не имеющая.


Согласен... Провел "эксперимент", действительно ругается на отсутствие инициализации... Но я четко помню что было сообщение об ошибке связанное с рекурсией... К сожалению у меня не осталось того кода который вызывал эту ошибку... Главное я понял что в моем случае надо использовать указатели, а не ссылки... И понял что такое NULL

Всем спасибо.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.