2013-07-10 3 views
1

У меня есть простой вопрос, но я не могу найти ответ.Тип использования до полной декларации

Возможно ли, что у Ada 2 типа, содержащих компонент друг друга?

Вот простой пример того, что я хочу сделать:

type Toto is record 
    T: Titi; 
end record; 

type Titi is record 
    T: Toto; 
end record; 

Это не работает таким образом, но это можно сделать что-то эквивалент?

ответ

5

Вы не можете сделать это: как должен быть создан экземпляр Toto? Он должен содержать экземпляр Titi, который, в свою очередь, содержит Toto и т. Д.

Однако нечто подобное можно:

type Titi; 

type Toto is record 
    T : access Titi; 
end record; 

type Titi is record 
    T : Toto; 
end record; 

В этом случае Toto содержит только ссылку/указатель на запись типа Тити, а не фактического Тити. Чтобы найти оптимальные объявления типов, тщательно подумайте о том, что вы хотите представлять с этими типами, и каковы отношения на самом деле. Я уверен, вы обнаружите, что то, что вы представили в своем вопросе, не точно отражает вашу проблему. Вместо этого, по крайней мере, один из Toto.T и Titi.T должен быть представлен значением доступа - возможно, и тем, и другим. Вы не говорите, что проблема, но я не знаю, что было бы лучшим (наиболее подходящим) объявлением типа здесь.

+0

Большое спасибо, это отвечает на мой вопрос. – Teodoro

0

Вам необходимо направить объявление Titi. Я думаю, что это должно сделать следующее:

type Titi; 

type Toto is record 
    T: Titi; 
end record; 

type Titi is record 
    T: Toto; 
end record; 
+0

Я пробовал, но он не работает, компилятор говорит: Недействительное использование типа перед его полным объявлением – Teodoro

+1

@Ansgar Esztermann имеет это право, используя указатель/доступ. Проблема здесь в том, что объявления titi и toto относятся к ним бесконечно. – NWS

+0

Yup. Если компилятор действительно пытался делать то, что он задает, он должен был бы бесконечно создавать поля записи, например изображения в зеркалах, расположенных на противоположных стенах. Учитывая, что у его машины нет бесконечной памяти, и у него нет вечности, чтобы ждать, кажется довольно разумным, чтобы компилятор (для любого языка) обозначил это как ошибку. :-) –

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