Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Новые Классы и указатели на них. Передача указателя на класс как параметр 
V
    Опции темы
Ner-zul
  Дата 28.4.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет




 Добрый день.

Вот столкнулся с проблемой . Я Работаю в Дельфи 6-7.

Я хочу создать свой класс , к примеру, с двумя полями только:

i:integer;
mas: array [1..Max] of char; 

, где константа 
Max = 10;

Я так понимаю пишется это вот так:

const
Max = 10;

type 
   newclass = class
i:integer;
mas: array [1..Max] of char; 

end;

Теперь я хочу создать указатель на свой класс,
наверно это делается так:

type
 Pnewclass = ^newclass ;

Если я не прав где-то - просьба меня поправить. Так как я этим материалом не владею и хочу разобраться.

Теперь я создам объекты  :

var
myclass:newclass;
pmyclass:pnewclass;

Теперь я хочу сделать так чтобы мой указатель указывал на объект моего класса,
наверно это делается вот так:

pmyclass:=pointer(myclass);

или

pmyclass^:=myclass;

Опять же , я не уверен.

Теперь, у меня есть какая-то процедура, в которую я в качестве параметров хочу передавать объекты своего класса. 

procedure MyProcedure (parametr1:newclass, parametr2:newclass);

Пусть я хочу сделать процедуру, которая будет менять два моих объекта местами. Тоесть их взаимно перезаписывать через тертий буферный объект. А  тогда , очевидно , что мне надо передавать как параметры процедуры именно Указатели на мои объекты и выглядеть это должно что-то типа того:

procedure MyProcedure (Pobject1:Pnewclass, Pobject2:Pnewclass);

0) Ведь так? Мои рассуждения верны?

К сожалению практика показывает , что данная реализация не жизнеспособна.
Более того, у меня серьезные подозрения, что я не правильно работаю с классами: создаю их, описываю и использую.

Покажите пожалуйста: 1) пример создания и использования классов .

2) А также использование указателей на классы в качестве параметров функций и процедур.

 






--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 28.4.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Стоп!
Для начала разберись с понятиями класс и объект.
Это разные вещи, а ты их тщательно перепутал.
PM MAIL   Вверх
Ner-zul
Дата 28.4.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



Нее.. я все четко понимаю. Я не перепутал.

Класс - это в моем примере :newclass.

 А объект этого класса я конечно кривенько назвал myclass.

Ну? так ведь?
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 28.4.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(Ner-zul @  28.4.2007,  14:39 Найти цитируемый пост)
Теперь я создам объекты  :
var
  myclass: newclass;
Это не создание объекта, а объявление переменной.
Для создания нужно вызвать конструктор.
Кстати, объект это уже указатель. Поэтому совершенно не понятно, зачем тебе указатель на указатель...

Добавлено @ 15:03
Какое-то всё плю-плюснотое.
Указатели, массив чаров...
Всё как-то спутано.
Пример нарисовать не трудно.
Только пример чего?
Что именно нужно?
Попробуй объяснить заново в 3-х предложениях, без кода.
PM MAIL   Вверх
Ner-zul
Дата 4.5.2007, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет





Да...я видимо запутался.

Тогда попробую совсем по-простому, не могли бы Вы привести мне пример создания простенького класса, а потом создание объекта этого класса и его использование в процедуре какой-нибудь.
Например. Пусть класс описывает объекты с одним полем чисел и одним строковым полем. А процедура меняет численные значения двух объектов местами.


--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
skyboy
Дата 4.5.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Код

type
 TMyClass = class(TObject)
 private
  _someInteger: integer;
  _someString: string;
  procedure setSomeInteger(const Value: integer);
  function getSomeString: string;
 public 
  constructor Create;
  someInteger: integer  read _someInteger write setSomeInteger; // в отличии от С++, в Delphi есть понятия свойств - синтаксических конструкций, инкапсулирующих доступ к реально существующим полям(переменным объекта) через функции/процедуры
  someString: string read getSomeString write _someString;
 end;

procedure TMyClass.setsomeInteger(const Value: integer);
begin
 if (Value > 255) AND (Value mod 5 <> 0) // демонстрация инкапсуляции логики проверки на валидность
  then
   _someInteger:= Value;
end;

function TMyClass.getSomeString:string;
begin
 Result:= '__' + Self._someString; // инкапсуляция логики обработки возвращаемых данных
end;

constructor TMyClass.Create; // конструктор применяется для инициализации полей
begin
 _someInteger:= 0;
 _someString:= ''; 
end;

.......
var 
 obj1,obj2: TMyClass;
 swap: integer; // переменная-"ведро" для обмена значениями
...
begin
 obj1:= TMyClass.Create; // В С++ было бы "TMyClass* obj1= new TMyClass();"
 obj2:= TMyClass.Create;
 obj1.someInteger:= 1024;
 obj2.someInteger:= 2048;
 swap:=  obj1.someInteger;
 obj1.someInteger:= obj2.someInteger;
 obj2.someInteger:= swap;

Может, излишне подробно smile
PM MAIL   Вверх
ama_kid
Дата 4.5.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(Ner-zul @  4.5.2007,  11:50 Найти цитируемый пост)
 не могли бы Вы привести мне пример создания простенького класса, а потом создание объекта этого класса и его использование в процедуре какой-нибудь.

Лови пример:
Код
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 MAX_LEN = 25;
type
 TMyClass = class
   FInt: integer;
   FChars: array[1..MAX_LEN] of char;
   constructor Create(Num:integer;InitStr:string);
   procedure Print;
 end;
 PMyClass = ^TMyClass;

{ TMyClass }

constructor TMyClass.Create(Num:integer;InitStr: string);
var
 i:integer;
begin
 FInt:=Num;
 for i:=1 to MAX_LEN do
  if i<=Length(InitStr) then FChars[i]:=InitStr[i]
                       else FChars[i]:=#0;
 inherited Create;
end;

var
 MC1,MC2: TMyClass;
 PMC1,PMC2: PMyClass;

procedure SwapPointers(var p1,p2:PMyClass);
var
 tmp:PMyClass;
begin
 tmp:=p2;
 p2:=p1;
 p1:=tmp;
end;

procedure SwapFields(var m1,m2:tMyClass);
var
 tmp:integer;
begin
 tmp:=m2.FInt;
 m2.FInt:=m1.FInt;
 m1.FInt:=tmp;
end;


procedure TMyClass.Print;
var
 i:integer;
begin
 writeln('FInt = ',FInt);
 write('FChars = ');
 for i:=1 to MAX_LEN do write(FChars[i],' ');
 writeln;
end;

begin
 MC1:=TMyClass.Create(1,'First Object');
 MC2:=TMyClass.Create(2,'Second Object');

 PMC1:=@MC1;
 PMC2:=@MC2;
 Writeln('Begin:');
 PMC1^.Print;
 PMC2^.Print;
 SwapPointers(PMC1,PMC2);
 Writeln('After swap pointers');
 PMC1^.Print;
 PMC2^.Print;
 SwapFields(MC1,MC2);
 Writeln('After swap fileds');
 PMC1^.Print;
 PMC2^.Print;
 PMC1:=nil;
 PMC2:=nil;
 MC1.Free;
 MC2.Free;
 readln;
end.



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Yanis
Дата 4.5.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(Ner-zul @  28.4.2007,  15:39 Найти цитируемый пост)
Теперь я создам объекты  :

Ошибаешься. Это экземпляры… Называй из переменными, собственно что и означает var перед ними.
Зачем указатель на класс, если класс собсно и есть указатель? Неужели так трудно посмотреть к примеру вот так SizeOf(TForm)?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ner-zul
Дата 11.5.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет




мм... Мне кажется я во всем разобрался.

Всем большое спасибо!

А вот такой вопрос теперь. В Дельфи есть аналог сишной структуры: typedef struct{}; ????

Я так понимаю в си есть отдельно классы и отдельно структуры, которые из себя представляют некое подобие классов. так? 

В Дельфи есть классы. С этим мы уже разобрались=) 

А есть ли в Дельфи что-то похожее на структуры? 
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
Snowy
Дата 11.5.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(Ner-zul @  11.5.2007,  15:14 Найти цитируемый пост)
А вот такой вопрос теперь.
Модератор: Пожалуйста, один топик - один вопрос.

Цитата(Ner-zul @  11.5.2007,  15:14 Найти цитируемый пост)
В Дельфи есть аналог сишной структуры: typedef struct{}; ????
record
PM MAIL   Вверх
MetalFan
Дата 11.5.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Ner-zul @  11.5.2007,  15:14 Найти цитируемый пост)
В Дельфи есть аналог сишной структуры: typedef struct{}; ????

Код

TBlablabla_AnalogCshnoyStructury = record
  AnalogCshnogoInt: Integer;
....
end;



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ner-zul
Дата 11.5.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 24.1.2004
Где: Москва

Репутация: нет
Всего: нет



Извините.
и Спасибо smile

Тема  закрыта.
--------------------
 Ner-zul   
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.