2015-09-05 3 views
1

Я работал над блоком AVL-дерева, где пользователь может указать, что он хочет иметь внутри дерева. Я использую объекты для этой цели. В моем модуле я определил родительский объект под названием Node, а указатель на этот объект - PTNode. В этом объекте у меня есть 3 атрибута: Balance: integer: Left, Right: PTNode для сыновей узла и 1 метод: Function Is_Greater (Node1: PTNode): целое число, которое является виртуальным и абстрактным. И пользователю остается определить эту функцию (я не знаю, будет ли это char или integer и т. Д.).Абстрактная функция в Pascal

Я пытался проверить это устройство, и я столкнулся с одной проблемой. Я создал дочерний объект моего объекта Node, называемый Object1 = Object (Node), и добавил один атрибут X: integer, и я хочу определить функцию Is_Greater. Вот декларация и часть кода:

Unit

Unit Tree; 
    interface 
    type PTNode=^Node; 
     Node=object 
      Left,Right:PTNode;  
      Balance:integer; 
      Function Is_Greater(Node1:PTNode):integer; virtual; abstract; 
      end; 

после этого списка I и осуществлять функции в моей части, которые не являются, что отношение к моей проблеме.

Это моя тестовая программа:

Program Test; 
uses Tree; 
    Type PTObject=^Object1; 
    Object1=object(Node) 
    X:integer; 
    Function Is_Greater(Node1:PTNode):integer; virtual; 
    end; 
Function Object1.Is_Greater(Node1:PTNode):integer; 
    begin 
    if X>Node1^.X then Is_Greater:=1 
    else if X<Node1^.X then Is_Greater:=-1 
    else Is_Greater:=0; 
end; 

, и это дает мне ошибку о том, что X не является частью узла объекта. Но когда я пытаюсь установить Node1: PTObject, тогда он дает мне ошибку, что моя функция не соответствует ее родительской. Я не знаю, как это решить.

+0

Приятно видеть такую ​​старую школу. На самом деле это не шутка. Однако, если вам нужна завершенная реализация дерева AVL, то это уже сделано в FCL: [Дерево AVL] (http://wiki.lazarus.freepascal.org/AVL_Tree). – Abelisto

+1

Мне это известно, но это школьный проект – ratrt13

ответ

1

Вы должны ввести отливать аргумент Node1:

if X>PTObject(Node1)^.X then Is_Greater:=1 
else if X<PTObject(Node1)^.X then Is_Greater:=-1 
else Is_Greater:=0; 
+1

Большое вам спасибо! – ratrt13

Смежные вопросы