Наследование и указатели в Фортране - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть тип для связанных списков в Fortran. Это довольно бесполезно, за исключением демонстрации связанных списков. Я надеюсь извлечь из него тип, который я смог бы найти для себя полезным. Мой базовый класс - link, а мой производный класс - useful_link. link ничего не делает, кроме как создает новый link и получает указатель на эту ссылку. Мое намерение состоит в том, что useful_link создаст новый useful_link, а также передаст некоторые полезные данные для его нового создания. (И, как вы можете догадаться, сделайте кучу других вещей, которые у меня нет времени или места для обсуждения.) Мой первый шаг при написании кода:

    module links
      type link
        type(link), pointer :: child => null()
      contains
        procedure :: reproduce
      end type link
    contains
      subroutine reproduce(this, child_ptr)
        class(link) :: this
        class(link), pointer :: child_ptr
        allocate(this%child)
        child_ptr => this%child
      end subroutine reproduce 
    end module links

    module useful_links
      use links
      type, extends(link) :: useful_link
        real*8 :: dataval
      contains
        procedure :: reproduce_w_data
      end type useful_link
    contains
      subroutine reproduce_w_data(this, child_ptr, dataval)
        class(useful_link) :: this
        class(useful_link), pointer :: child_ptr
        call this%link%reproduce(child_ptr)   ! <--- problem!
        child_ptr%dataval = dataval
      end subroutine reproduce_w_data
    end module useful_links

Это не компилируется. gfortran говорит мне: «Ошибка: фактический аргумент для« child_ptr »... должен иметь тот же объявленный тип», и проблема в вызове reproduce в подпрограмме reproduce_w_data. Кроме того, если я переписываю код для удаления аргументов child_ptr и пытаюсь присвоить dataval новой ссылке с помощью

this%child%dataval = dataval

тогда gfortran скажет мне, что "dataval" ... не является членом структуры "link". Ну, это все имеет смысл, но, безусловно, есть какой-то способ сделать эту работу. Кто-нибудь знает, что это такое?

Кстати, я видел примеры, в которых используется конструкция select type, но это ужасно громоздко, и, если я это понимаю, мне придется каждый раз добавлять новый параметр к reproduce в типе link. добавлен новый тип наследования, который, как мне кажется, победил одну из целей ООП. Я прав в этом? Я довольно новичок в ООП в Фортане.

Наконец, кто-нибудь может порекомендовать хорошую ссылку на это? Кажется, есть много людей, которые хорошо знают этот материал, но я не могу найти место, где все это собрано в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...