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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2010, 17:34   #1
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию Классы и указатели

Пишу класс (наследник TStringList) для бана в чате.
Имеется вот такая конструкция
Код:
type
  TBan = class;

  PBanItem = ^TBanItem;
  TBanItem = record
    UserName: String[15];
    Format: Char;
    TTL: Integer;
  end;

  PBanItemList = ^TBanItemList; // <<- Вот тут
  TBanItemList = array[0..MaxListSize - 1] of TBanItem;

  TBan = class(TStringList)
  private
    FList: PBanItemList;
    FCount: Integer;
    FCapacity: Integer;
    procedure Grow;
  protected
    function InsertItem(Index: Integer; NewItem: PBanItem): Integer;
  public
    function Add(const UserName: String; const TTL: Integer;
      Format: Char): Integer;
  end;
Все бы ничего, но на строку PBanItemList = ^TBanItemList; ругается компилятор:
Код:
[Error] banlist.pas(23): 'TBanItemList' is not a type identifier
Хотя выше есть похожая конструкция указателя на запись, да и в исходниках TStringList точно также описан массив записей.
В чем может быть проблема?
И еще вопрос: если я создаю наследника класса, то он должен видеть все методы и свойства предка или нет? (мне кажется должен)
psycho-coder вне форума Ответить с цитированием
Старый 05.01.2010, 18:49   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Мене кажется с указателями не стоит связываться. Можно просто свой тип тип обернуть в класс, и создать функциональный класс для него (как то так, объяснить толком не могу )
Ну вот что то типа такого:
Код:
type

  TRBan = record
    UserName: String[15];
    Format: Char;
    TTL: Integer;
  end;

   TBanItem=class
   Public
      ban : TRBan;
   end;

   TBan=class
   Public
     ///Функционал для вашего класса TBanItem
 end;
Вот что то типа такого, но я не уверен точно, пусть профи подправят если что не так

Цитата:
И еще вопрос: если я создаю наследника класса, то он должен видеть все методы и свойства предка или нет? (мне кажется должен)
Секция приват родительского класса, классу предка не доступна вроде.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 05.01.2010 в 21:58.
spamer вне форума Ответить с цитированием
Старый 05.01.2010, 19:16   #3
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
TBanItem=class
   Public
      ban : TBanItem;
   end;
Что то не совсем понял что тут происходит)) Получается мы объявляем переменную типом класса, в котором она объявлена)
Может Вы хотели показать так?
Код:
TBanItem=class
   Public
      ban : TRBan;
   end;
Но мне все равно нужен массив этих записей.
Пока заменил на такую (Обновлено)
Код:
PBanItemList = ^TBanItemList;
TBanItemList = array[0..65535] of TBanItem;
Тогда компилируется нормально. Видимо размер массива испугал его

апд
Цитата:
Не вижу смысла в таком коде, т.к. класс уже является указателем. Соответственно и тема теряет свой смысл
Хм... А я думал это указатель на массив

Последний раз редактировалось psycho-coder; 05.01.2010 в 19:43.
psycho-coder вне форума Ответить с цитированием
Старый 05.01.2010, 19:27   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
 PBanItemList = ^TBanItemList; // <<- Вот тут
Не вижу смысла в таком коде, т.к. класс уже является указателем. Соответственно и тема теряет свой смысл
BOBAH13 вне форума Ответить с цитированием
Старый 05.01.2010, 20:13   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
 PBanItemList = ^TBanItemList; // <<- Вот тут
убрать.
не нужно оно тут.
Цитата:
Секция приват родительского класса, классу предка не доступна вроде.
вообще то protected видна лишь наследникам этого класса.
а private наследникам этого класса но в том же модуле что и предок.

TC, может вам нужно всетаки за базу TList брать?
кстати не советую в класс(я про структуры) оборачивать...в Делфи они не очень хороши(много лишнего)...
хотя иногда приходится..
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.01.2010, 20:36   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
TC, может вам нужно всетаки за базу TList брать?
Возможно... Просто хотел не заморачиваться с сохранением (в итоге замора еще больше((), в TStringList оно уже есть.
Цитата:
кстати не советую в класс(я про структуры) оборачивать...в Делфи они не очень хороши(много лишнего)...
А чего в них лишнего? Проведите пожалуйста краткий ликбез (можно ссылку)
psycho-coder вне форума Ответить с цитированием
Старый 05.01.2010, 20:58   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

возьмите лучше за основу TList
потому что TStringList всетаки на другое основан...
хотя если применить его св-во Data(каждой строке соотвестствует указатель на любые данные(тока освобождать не забывайте))

Цитата:
А чего в них лишнего?
посмотрите список св-в и методов TObject, поймете
я это к тому что просто так сдуру не стоит оборачивать все в классы(по крайней мере в Делфи)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.01.2010, 22:03   #8
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Что то не совсем понял что тут происходит)) Получается мы объявляем переменную типом класса, в котором она объявлена)
Может Вы хотели показать так?
Сори...сори в спешке писал и ошибся...исправил.

Цитата:
вообще то protected видна лишь наследникам этого класса.
а private наследникам этого класса но в том же модуле что и предок.
За protected я знал, а вот за private не помнил, спс Пепел Феникса, что подправил.

з.ы. а мене с классами удобно работать...хотя в данном случае возможно и...хотя не, я бы класс юзал
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 05.01.2010, 23:15   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Всем спасибо! Сделал через TList. Правда не обернул в класс (пока).
Во вложении пример, может кому пригодится.
Вложения
Тип файла: rar TestBanList.rar (4.5 Кб, 6 просмотров)

Последний раз редактировалось psycho-coder; 05.01.2010 в 23:18. Причина: описка
psycho-coder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели Mighty Помощь студентам 1 24.10.2009 18:01
Указатели Paul_AG Общие вопросы C/C++ 5 03.07.2009 14:22
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
указатели Armina Общие вопросы C/C++ 4 22.04.2009 20:05