Создать отношения родитель / ребенок в классе - PullRequest
0 голосов
/ 26 августа 2018

У меня есть два класса, дочерний класс:

type MyChildClass = class
public
parent: ^MyParent;
end;

И родительский класс:

type MyParentClass = class
public
childs: array of ^MyChildClass;
end;

Однако это не будет работать, поскольку только класс, объявленный последним, знает другойодин.Пример:

program Test;

interface

type MyChildClass = class
public
parent: ^MyParentClass;
end;

type MyParentClass = class
public
childs: array of ^MyChildClass;
end;

implementation

end.

Это не скомпилируется, потому что 7-я строка выдаст ошибку «Необъявленный идентификатор« MyParentClass », как и ожидалось. Использование абстрактных классов решает проблему только частично. Я действительно изо всех сил пытаюсь найти решение. Может быть, используяИнтерфейсы помогут?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Pascal - это язык, скомпилированный одним проходом, поэтому компилятор сканирует только один раз один файл: в каждый момент он должен знать каждый идентификатор.Когда вы создаете циклическую ссылку, как в этом случае, вы ссылаетесь на класс, написанный после текущего, который не разрешен.Чтобы решить эту проблему, вам нужно использовать так называемое предварительное объявление , то есть вы объявляете (обещаете) компилятору, что где-то в вашем коде он найдет этот идентификатор (посмотрите на код, problem1 ).

Кроме того, вы определяете несколько областей разных типов (записывая type несколько раз).Каждая область типов имеет свои собственные типы (и тип, определенный в области, не может быть виден другой областью действия), следовательно, вам нужно определить одну (посмотрите на код, problem2 ).

program Test;

interface

type // declare a single type scope (problem 2)
    MyParentClass = class; // this is the forward declaration (problem 1)

    MyChildClass = class
    public
        parent: ^MyParentClass;
    end;

    MyParentClass = class
    public
        childs: array of ^MyChildClass;
    end;

implementation

end.
0 голосов
/ 26 августа 2018
program Test;

interface
type 
    MyParentClass = class;

    MyChildClass = class
    public
        parent: ^MyParentClass;
    end;

    MyParentClass = class
    public
        childs: array of ^MyChildClass;
    end;

implementation

end.
...