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

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

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

Ответить
Mike81
незнакомец
Сообщения: 9
Зарегистрирован: 20.02.2012 14:11:36

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

Сообщение Mike81 »

У меня возник вопрос возможно ли переопределение(или просто определение) арифметических операторов внутри создаваемого класса в fpc 2.6.0?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Искусственный пример для класса:

Код: Выделить всё

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
Mike81
незнакомец
Сообщения: 9
Зарегистрирован: 20.02.2012 14:11:36

Сообщение Mike81 »

Спасибо Большое за развернутый ответ и ссылку на 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 раза.
Аватара пользователя
AlexVinS
новенький
Сообщения: 95
Зарегистрирован: 27.01.2009 00:18:01

Сообщение AlexVinS »

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

Код: Выделить всё

class operator Add (z1 : TInt;r : TInt) : Integer;


Для OBJFPC:

Код: Выделить всё

class operator +(z1 : TInt;r : TInt) : Integer;
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Омг, обьясните мне какой должен был быть функционал у оператора? вы хотели что то прибавить, и увеличить что-то внутри, или прибавить переменную A к B, а увеличить счетчик в C.
Аватара пользователя
AlexVinS
новенький
Сообщения: 95
Зарегистрирован: 27.01.2009 00:18:01

Сообщение AlexVinS »

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

Это в любом случае не сработает - оператор = статический (классовый) метод.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

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

В топике я увидел что человек хочет Наверное перегрузку операторов. Из-за чего я и подумал, что человеку нужна перегрузка оператора, привел пример, мануал. А он говорит что это не то, чего хотелось, вот я и не пойму, что должно-то быть... просто я немного не пойму логику. чень из наваротов С++
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

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


В приведенных примерах идет обращение к переменным классов, в принципе Вы можете их не только читать, но и изменять.
А вот их Вашего примера непонятно из какого экземпляра класса будет переменная data.
Например: sum:=a+b;
В каком из экземпляров класса (sum, a или b) должно произойти прибавление переменной data?
Павел Ишенин
постоялец
Сообщения: 475
Зарегистрирован: 24.03.2007 09:16:52

Сообщение Павел Ишенин »

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;
Ответить