Переопределение оператора в классе

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Переопределение оператора в классе

Сообщение Mike81 » 19.03.2012 12:34:25

У меня возник вопрос возможно ли переопределение(или просто определение) арифметических операторов внутри создаваемого класса в fpc 2.6.0?
Mike81
незнакомец
 
Сообщения: 9
Зарегистрирован: 20.02.2012 14:11:36

Re: Переопределение оператора в классе

Сообщение Maxizar » 19.03.2012 19:49:42

Искусственный пример для класса:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  { TInt }

  TInt = class(TObject)

    private
       FInt:Integer;
    public
       constructor Create(value:Integer);
       destructor Destroy; override;
       property Int:Integer  read FInt write FInt;


  end;

  operator + (z1 : TInt;r : TInt) b : Integer;


var
  Form1: TForm1;

implementation


operator+(z1: TInt; r: TInt)b: Integer;
begin
  b := z1.FInt + r.FInt;
end;


constructor TInt.Create(value:Integer);
begin
  inherited Create();
  FInt :=value;
end;

destructor TInt.Destroy;
begin
  inherited Destroy;
end;

{ TInt }



{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var v1, v2:TInt;
begin
    v1 :=TInt.Create(12);
    v2 :=TInt.Create(10);

    Caption:=IntToStr(v1+v2);
    v1.Free;
    v2.Free;
end;

end.




Пример для записи:
Код: Выделить всё

{$ifdef ComplexIsSingle}
    const
      MinComplex  =  1.5e-45;
      MaxComplex  =  3.4e+38;

    Type
      PComplex =^TComplex;
      TComplex = record
         Re,
         Im:Single;
    end;// TComplex = record



{Переопределение сложения Add +}
  operator + (L : Extended; R : TComplex) z : TComplex;
  operator + (L : TComplex; R : Extended) z : TComplex;
  operator + (L : TComplex; R : TComplex) z : TComplex;


{Переопределение сложения Add +}

operator + (L : Extended; R : TComplex) z : TComplex;
begin
  z.Re:=R.Re+L;
  z.Im:=R.Im;
end;
//------------------------------------------------------------------//

operator + (L : TComplex; R : Extended) z : TComplex;
begin
  z.Re:=L.Re+R;
  z.Im:=L.Im;
end;
//------------------------------------------------------------------//

operator + (L : TComplex; R : TComplex) z : TComplex; assembler;
{$ASMMODE intel}
asm
  FLD   TComplex.Re [EAX]
  FLD   TComplex.Re [EDX]
  FADD
  FSTP  TComplex.Re [ECX]
  FLD   TComplex.Im [EAX]
  FLD   TComplex.Im [EDX]
  FADD
  FSTP  TComplex.Im [ECX]
//begin
  //    z.Re:=L.Re+R.Re;
  //    z.Im:=L.Im+R.Im;
  end;
//------------------------------------------------------------------//


Информация: Reference guide for Free Pascal, version 2.2.4 глава: Operator overloading
Интернет: Operator overloading
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Переопределение оператора в классе

Сообщение Mike81 » 20.03.2012 11:35:27

Спасибо Большое за развернутый ответ и ссылку на guide for Free Pascal. Я, правда, имел ввиду немного другое.
Код: Выделить всё
TInt = class(TObject)
    private
       FInt:Integer;
    public
       data :integer;
       constructor Create(value:Integer);
       destructor Destroy; override;
       property Int:Integer  read FInt write FInt;
      operator + (z1 : TInt;r : TInt) b : Integer;

  end;


Мне это нужно затем, чтобы при описании оператора + я мог пользоавться внутренними переменными класса, например переменной data которую я ввел искуственно в этом примере.

ну то есть что-то навроде такого
Код: Выделить всё
operator TInt. +(z1: TInt; r: TInt)b: Integer;
begin
data:=data+1;
  b := z1.FInt + r.FInt;
end;

или вот так как нибудь так

Код: Выделить всё
TInt = class(TObject)
    private
       FInt:Integer;
    public
       data :integer;
       constructor Create(value:Integer);
       destructor Destroy; override;
       property Int:Integer  read FInt write FInt;
      operator + (z1 : TInt;r : TInt) b : Integer;
       begin
       data:=data+1;
        b := z1.FInt + r.FInt;
       end;

  end;

но похоже, такой возможности нет. Еще раз спасибо за ответ...
Последний раз редактировалось Mike81 21.03.2012 00:09:10, всего редактировалось 2 раз(а).
Mike81
незнакомец
 
Сообщения: 9
Зарегистрирован: 20.02.2012 14:11:36

Re: Переопределение оператора в классе

Сообщение AlexVinS » 20.03.2012 18:48:47

В $MODE DELPHI и при включенном $MODESWITCH ADVANCEDRECORDS операторы определяются уже внутри класса. Для дельфи-режима

Код: Выделить всё
class operator Add (z1 : TInt;r : TInt) : Integer;


Для OBJFPC:
Код: Выделить всё
class operator +(z1 : TInt;r : TInt) : Integer;
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Переопределение оператора в классе

Сообщение Maxizar » 20.03.2012 20:03:52

Омг, обьясните мне какой должен был быть функционал у оператора? вы хотели что то прибавить, и увеличить что-то внутри, или прибавить переменную A к B, а увеличить счетчик в C.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Переопределение оператора в классе

Сообщение AlexVinS » 20.03.2012 20:27:23

Maxizar писал(а): вы хотели что то прибавить, и увеличить что-то внутри, или прибавить переменную A к B, а увеличить счетчик в C.

Это в любом случае не сработает - оператор = статический (классовый) метод.
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Переопределение оператора в классе

Сообщение Maxizar » 20.03.2012 20:34:28

Это в любом случае не сработает - оператор = статический (классовый) метод.

В топике я увидел что человек хочет Наверное перегрузку операторов. Из-за чего я и подумал, что человеку нужна перегрузка оператора, привел пример, мануал. А он говорит что это не то, чего хотелось, вот я и не пойму, что должно-то быть... просто я немного не пойму логику. чень из наваротов С++
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Переопределение оператора в классе

Сообщение alexey38 » 21.03.2012 04:33:55

Mike81 писал(а):Спасибо Большое за развернутый ответ и ссылку на guide for Free Pascal. Я, правда, имел ввиду немного другое.
Мне это нужно затем, чтобы при описании оператора + я мог пользоавться внутренними переменными класса, например переменной data которую я ввел искуственно в этом примере.
но похоже, такой возможности нет. Еще раз спасибо за ответ...


В приведенных примерах идет обращение к переменным классов, в принципе Вы можете их не только читать, но и изменять.
А вот их Вашего примера непонятно из какого экземпляра класса будет переменная data.
Например: sum:=a+b;
В каком из экземпляров класса (sum, a или b) должно произойти прибавление переменной data?
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Переопределение оператора в классе

Сообщение Павел Ишенин » 21.03.2012 08:25:47

Mike81 писал(а):Спасибо Большое за развернутый ответ и ссылку на guide for Free Pascal. Я, правда, имел ввиду немного другое.
ну то есть что-то навроде такого

Код: Выделить всё
operator TInt. +(z1: TInt; r: TInt)b: Integer;
begin
data:=data+1;
  b := z1.FInt + r.FInt;
end;



Можно же сделать так:

Код: Выделить всё
operator +(z1: TInt; r: TInt)b: Integer;
begin
  z1.data:=z1.data+1;
  b := z1.FInt + r.FInt;
end;
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru