Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по C#...  (Прочитано 12098 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Okkkks
Помогающий

by
Offline Offline

« : 27-09-2010 05:17 » 

Доброго времени суток.
Как-то наткнулась в инете на такую вещь:
например,
class Class1
{
     private Class1 name;
}

Ребята, подскажите что это такое (поле типа этого же класса), как это называется (а то даже не знаю как у гугла об этом спросить  Краснею), зачем это используется?
Может кто знает... =))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 27-09-2010 05:37 » 

В шарпе, если не путаю, классы - ссылочные типы, то есть в C++ данный код выглядел бы как-то так

Код:
class Class1
{
     private:
        Class1* name;
};

а ссылку (указатель) сам на себя класс может делать спокойно
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #2 : 27-09-2010 05:39 » 

ммм... значит это ссылка на самого себя... спасибо =)) пошла гуглить =))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 27-09-2010 05:47 » 

не, я не так выразился, не на самого себя, а на объект своего типа
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #4 : 27-09-2010 05:53 » 

пасиба =))
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 27-09-2010 07:13 » 

...зачем это используется?

Например, для построения связного списка. Каждый элемент хранит ссылку на следующий, и можно последовательно пройти всю цепочку.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Okkkks
Помогающий

by
Offline Offline

« Ответ #6 : 29-09-2010 09:56 » 

у меня просто как-то в мозгу не укладывается как можно создать объект класса когда ты этот класс ещё не написал до конца... как-то так...  Краснею
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 29-09-2010 09:57 » 

Okkkks, а покажи, где у тебя так ?
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 29-09-2010 10:06 » 

Okkkks, а ты попробуй объяснить, как этот код обрабатывается компилятором и работает. В твоём объяснении будут пробелы и ошибки - мы их поправим, и всё срастётся.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Okkkks
Помогающий

by
Offline Offline

« Ответ #9 : 29-09-2010 10:15 » 

Код:
   public class Link //класс "единицы структуры"
    {
       public Link()//конструктор
       {
           //ссылки на следующий и предыдущий элемент
           prev = next = null;
       }
       //поля класа: объект и ссылки на предыдущий и следующий
       Link prev, next;
       Element item; //объект класса хранящий полезную инфу
    
.....
    }

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

а объяснить как это обрабатывает компилятор я наверное даже и не смогу путно... Краснею
Но я попробую =)
когда мы компилируем у нас по идее где-нибудь должен  создаться объект этого класса.
но как у этого класса могут быть поля типа этого класса я всё таки не представляю... =(
и в конструкторе поля инициализируются до объявления =((
« Последнее редактирование: 29-09-2010 10:21 от Okkkks » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 29-09-2010 10:21 » 

Ян, во время компиляции ещё нет выполнения программы, а значит нет никаких экземпляров (компиляция - это всего лишь "перевод" текста в машинные команды. Ну, у шарпа они там не совсем ещё машинные, но суть та же)

И, опять таки, тут у тебя ссылки, а не экземпляры описаны. А ссылка - это хранилище адреса. Там может храниться несуществующий адрес, то есть, даже когда программа запущена, хранилище адреса может спокойно существовать без указуемого объекта Улыбаюсь
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #11 : 29-09-2010 10:26 » 

о как... оказывается =))
а почему компилятор не ругается на  prev = next = null; в конструкторе, когда тип этих переменных указывается ниже? Ведь сначала же конструктор вызывается и по идее он не должен знать этих переменных...  
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 29-09-2010 10:36 » 

когда тип этих переменных указывается ниже?

"Географическое" место не имеет значения. К моменту вызова ф-ции (конструктора) они известны. Но если тебе так легче, можешь написать их вверху.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 29-09-2010 10:37 » new

не ругается, так как имя типа уже определено
Код:
public class Link  //<<<<<<<<<<<<
{
   ....
после определения ИМЕНИ типа, можно объявлять ссылки и указатели на экземпляры типа (а вот экземпляр объявлять ещё не очень можно - длянего требуется полное описание типа)


А нИже у тебя идёт декларация переменных-членов класса, которые становятся видны в функциях сразу по всему классу. Поэтому можно декларацию переменной-члена сделать ниже, чем будет упоминание этой переменной в одной из функций класса
Записан

Okkkks
Помогающий

by
Offline Offline

« Ответ #14 : 29-09-2010 10:39 » 

хм... понятно... Здесь была моя ладья...
спасибо вам огромное за ответы =))
теперь осталось переварить... =) попробую написать ещё что-нибудь похожее с практикой лучше усваивается =))
ещё раз спасибо! =))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines