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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2010, 14:08   #1
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию Класс написан, как посчитать кол-во экземпляров

Здравствуйте.
Класс я вроде бы сделал. Посмотрите, пожалуйста, может где-то есть неправильности.
Мне теперь для проверки нужно посчитать количество экземпляров класса. Пробовал вводить счётчик и +1 по Create и -1 по Destroy. Но не знаю как добраться к этой переменной чисто через класс, а не от экземпляра. Подскажите как это сделать?
Кидаю листинг класса и прикрепляю исходники с работой над классом:

Код:
unit TLanguageParser_class;

interface


uses
  Windows, Messages, SysUtils, Dialogs;

type
    TLanguageParser=class(TObject)
    private
      InFile:Text;
      MasStr:array of WideString;
      Count:integer;
    public
      oBjCount:integer;
      constructor Create(FileName:String); virtual;
      destructor Destroy; virtual;
      function GetString(N:Integer): WideString;
      function print(i:integer):WideString;
      function GetCount():integer;
    end;

implementation

{ TLanguageParser }

constructor TLanguageParser.Create(FileName: String);
var
 str_tmp:WideString;
 k:integer;
begin
 if not FileExists(FileName)
  then ShowMessage('Файл '+FileName+' не существует')
  else
     try
      // oBjCount:=oBjCount+1;
       Count:=0;
       k:=0;
       AssignFile(InFile,FileName);
       Reset(InFile);
       while not Eof(InFile) do
        begin
          inc(Count);
          Readln(InFile,str_tmp);
        end;
       SetLength(MasStr,Count);
       CloseFile(InFile);
       Reset(InFile);
       while not Eof(InFile) do
        begin
          Readln(InFile,MasStr[k]);
          inc(k);
        end;
       CloseFile(InFile);
     except
       CloseFile(InFile);
       MasStr:=nil;
       ShowMessage('Ошибка при работе с файлом '+FileName);
     end;
end;


destructor TLanguageParser.Destroy;
begin
 //oBjCount:=oBjCount-1;
 MasStr:=nil;
end;

function TLanguageParser.GetCount: integer;
begin
 result:=count;
end;


function TLanguageParser.GetString(N: Integer): WideString;
begin
 ShowMessage('!!!!');
end;

function TLanguageParser.print(i:integer):WideString;
begin
 Result:=MasStr[i];
end;

end.
Вложения
Тип файла: rar parser.rar (8.9 Кб, 9 просмотров)

Последний раз редактировалось Arkuz; 18.04.2010 в 14:10.
Arkuz вне форума Ответить с цитированием
Старый 18.04.2010, 14:36   #2
bitSoft
Programming...
Форумчанин
 
Аватар для bitSoft
 
Регистрация: 13.03.2010
Сообщений: 198
По умолчанию

Код:
function TLanguageParser.GetCount: integer;
begin
 result:=Length(MasStr);
end;
i kstati ne -
Код:
a.Create('test.txt');
a -
Код:
a := TLanguageParser.Create('test.txt');
Код:
With TProgrammersForum.Create do  AddNewTopic('Title','Content...');

Последний раз редактировалось bitSoft; 18.04.2010 в 14:40.
bitSoft вне форума Ответить с цитированием
Старый 18.04.2010, 16:55   #3
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Это видимо старый код, я всё устранил...

Надо как-то проверить корректность создания и удаления объектов. По-моему у меня деструктор не работает.
Arkuz вне форума Ответить с цитированием
Старый 19.04.2010, 07:33   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Работать-то он работает, но как? Чтобы осовбодить память тебе нужно каждый элемент массива сделать =''; А потом осовбодить память под массивом. SetLength(MasStr, 0); Так освободиться точно. Также в секции except.
И при создании класса желательно Inherited Create; а затем также SetLength(MasStr, 0); чтобы выделить место под структуру.

Цитата:
Мне теперь для проверки нужно посчитать количество экземпляров класса.
Зачем?

Можно просто объявить
Код:
var
    OBJ: array [1..10] of TLanguageParser;
Либо использовать динамический массив и тогда Вы всегда точно будете знать сколько у Вас объектов.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.04.2010, 08:38   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Arkuz
Насколько я знаю Делфи не Си. Работа со статическими вещами у нее не очень развита.
Я обычно создаю еще один класс контейнер на основе TObjectList например, и все создаваемые экземпляры класса помещаю в этот Лист, ну а уж из него узнать кол-во не сложно - свойство Count
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.04.2010, 08:55   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
interface
type
  TMyclass=class
    function countexp: integer;
    constructor Create;
    destructor Destrioy; override;
  end;

implementation

var //в разделе implementation чтобы никто Кроме TMyClass даже не знал о ее существовании
  _countexp: integer;  //глобальный счетчик экземпляров

constructor TMyclass.Create;
begin
  Inc(_countexp);
....
end;

destructor TMyClass.Destroy;
begin
  Dec(_countexp);
 ...
end;

function TMyclass.countexp: integer;
begin
  result:=_countExp;
end;

initialization
  _сountexp:=0;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.04.2010 в 08:59.
evg_m вне форума Ответить с цитированием
Старый 19.04.2010, 09:21   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Насколько я знаю Делфи не Си. Работа со статическими вещами у нее не очень развита.
В новых Дельфях классы (именно классы, а не только их экземпляры) теперь имеют и переменные и свойства и константы. Писал об этом во втором выпуске журнала .

Код:
type
    TLanguageParser=class(TObject)
    private
      InFile:Text;
      MasStr:array of WideString;
      Count:integer;
    public
      var          
          oBjCount:integer;
      constructor Create(FileName:String); virtual;
      destructor Destroy; virtual;
      function GetString(N:Integer): WideString;
      function print(i:integer):WideString;
      function GetCount():integer;

    end;
Можно попробовать так. А в конструкторе:
Код:
Inc(TLanguageParser.ObjCount);
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 19.04.2010 в 09:24.
Utkin вне форума Ответить с цитированием
Старый 19.04.2010, 09:28   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Utkin
Ну не все еще рискнули новую версию рулить
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как посчитать кол-во повторений? Pro100c00l Помощь студентам 5 03.12.2009 01:00
Посчитать кол-во символов Memo EleGant Общие вопросы Delphi 15 20.10.2009 10:34
Найти кол-во целых чисел в первой последовательности и кол-во нечетных во второй. DjDeniels-61 Помощь студентам 7 28.06.2009 13:04
Как посчитать кол-во разных записей в столбце и сделать двойную сортироку katlis Microsoft Office Excel 2 16.03.2009 17:09
Как узнать на чем написан сайт? Artem HTML и CSS 16 02.11.2007 00:03