2012-06-13 1 views
3

Может кто-нибудь пожалуйста, дайте мне пример того, как это должно быть для простого Fortran 2003 объектно-ориентированного макет эквивалента этого C++ кода:Полный объектно-ориентированный пример с fortran 2003?

stefanos-imac:tmp borini$ more Animal.h 
class Animal { 
    public: 
     Animal(int age); 
     ~Animal(); 
     virtual void speak(); 
     int getAge(); 
    private: 
     int age; 
}; 

stefanos-imac:tmp borini$ more Animal.cpp 
#include <Animal.h> 
#include <iostream> 
Animal::Animal(int age) { 
    std::cout << "init animal" << age << std::endl; 
    this->age = age; 
} 
Animal::~Animal() { 
    std::cout << "dtor animal" << std::endl; 
} 
void Animal::speak() { 
    std::cout << "speak not reimplemented" << std::endl; 
} 
int Animal::getAge() { 
    return this->age; 
} 
stefanos-imac:tmp borini$ more Cat.h 
#include <Animal.h> 
class Cat : public Animal { 
    public: 
     Cat(int age); 
     ~Cat(); 
     virtual void speak(); 
}; 
stefanos-imac:tmp borini$ more Cat.cpp 
#include <Cat.h> 
#include <iostream> 
Cat::Cat(int age) : Animal(age) { 
    std::cout << "init cat" << std::endl; 
} 
Cat::~Cat() { 
    std::cout << "dtor cat" << std::endl; 
} 
void Cat::speak() { 
    std::cout << "meow" << std::endl; 
} 
stefanos-imac:tmp borini$ more main.cpp 
#include <iostream> 
#include <Cat.h> 

int main() { 
    Cat c(10); 

    std::cout << c.getAge() <<std::endl; 
    c.speak(); 
} 

У меня возникают проблемы с моим кодом, обратитесь к следующей

stefanos-imac:oop borini$ more Animal.f90 
module AnimalModule 
    implicit none 
    private 
    public :: AnimalType 

    type :: AnimalType 
     private 
     integer :: age 
    contains 
     procedure :: getAge 
     procedure :: speak 
     final :: dtor 
    end type 

    interface AnimalType 
     module procedure ctor 
    end interface 
contains 
    subroutine ctor(self, age) 
     type(AnimalType), intent(inout) :: self 
     integer :: age 
     print *, "Constructor Animal" 
     self%age = age 
    end subroutine 
    subroutine dtor(self) 
     type(AnimalType), intent(inout) :: self 
     print *, "Destroying animal" 
    end subroutine 

    function getAge(self) 
     class(AnimalType), intent(inout) :: self 
     integer :: getAge 
     getAge = self%age 
    end function 
    subroutine speak(self) 
     class(AnimalType), intent(in) :: self 

     print *, "Animal::speak not overridden" 
    end subroutine 
end 

stefanos-imac:oop borini$ more Cat.f90 
module CatModule 
    use AnimalModule 
    implicit none 
    private 

    type, extends(AnimalType) :: CatType 
     private 
    contains 
     procedure :: speak 
     final :: dtor 
    end type 

    interface CatType 
     module procedure ctor 
    end interface 

contains 
    subroutine ctor(self, age) 
     type(CatType), intent(inout) :: self 
     integer, intent(in) :: age 
     print *, "Constructor Cat" 
     self%AnimalType = AnimalType(age) 
    end subroutine 
    subroutine dtor(self) 
     type(CatType), intent(inout) :: self 
     print *, "Destroying Cat" 
    end subroutine 
    subroutine speak(self) 
     class(CatType), intent(in) :: self 

     print *, "Meow" 
    end subroutine 
end 

stefanos-imac:oop borini$ ifort Animal.f90 Cat.f90 
Cat.f90(10): error #8341: Final subroutines are not inherited through type extension and cannot be overridden. [DTOR] 
     final :: dtor 
---------------^ 
Cat.f90(22): error #6292: The parent type of this field is use associated with the PRIVATE fields attribute [AGE] 
     self%AnimalType = AnimalType(age) 
-----------------------------------^ 
compilation aborted for Cat.f90 (code 1) 
stefanos-imac:oop borini$ 

В частности, мне не ясно, как инициализировать базовый класс и как определить деструктор для производного класса.

Благодаря

ответ

4
subroutine ctor(self, age) 
     type(CatType), intent(inout) :: self 
     integer, intent(in) :: age 
     print *, "Constructor Cat" 
     self%AnimalType = AnimalType(age) 
    end subroutine 

Это неправильно. В CatType нет компонента AnimalType. Он расширяет тип AnimalType. ctor - это подпрограмма, и вы используете ее как функцию. Я предлагаю вам определить конструктор (но он будет скорее просто инициализировать, а не выделять) как функцию, но также можно использовать подпрограмму. Вы можете использовать блок интерфейса так же, как для достижения того же имени, что и имя класса, но вы должны быть согласованным и использовать CALL, если вы определили его как подпрограмму.

В конструкторе производного класса вы можете просто установить нужный компонент или использовать конструктор базового класса. Не забудьте написать правильные рабочие пользовательские задания для ваших типов.

+2

На самом деле, стандарт Fortran 2008 (ну, пункт 4.5.7.2.2 позднего варианта стандарта - ISO/IEC JTC 1/SC 22/WG 5/N1830). * Расширенный тип имеет скаляр, nonpointer, nonallocatable, parent component с типом и типом параметров родительского типа. Имя этого компонента - это имя родительского типа. *, Что делает ваше первое предложение неправильным. У меня нет стандарта Fortran 2003, но я сомневаюсь, что этот аспект языка изменился между стандартами. Я согласен с общей тягой остальной части вашего ответа. –

+0

OK, спасибо. Может быть, я это прочитал, но я, конечно, забыл об этом. –