私のIDEは次のとおりです:Code :: Blocks 20.03(MinGW 9.2.0)
これは私のコードです:
module mod_kompleks
use, intrinsic :: iso_c_binding, only : rp => c_double
implicit none
type, public :: kom_bro
real(rp), private :: rea
real(rp), private :: img
contains
procedure, pass(kdt), private :: kom_bro_ini
procedure, pass(kdt), public :: uzm_rea => uzm_pod_rea
procedure, pass(kdt), public :: uzm_img => uzm_pod_img
procedure, pass(kdt), private :: kom_bro_sab
generic, public :: operator(+) => kom_bro_sab
end type kom_bro
interface kom_bro
module procedure kom_bro_kon
end interface kom_bro
private :: kom_bro_kon
contains
function kom_bro_kon( bro_rea, bro_img ) result( bro )
real(rp), intent(in) :: bro_rea
real(rp), intent(in) :: bro_img
type(kom_bro) :: bro
call bro%kom_bro_ini(bro_rea, bro_img)
end function kom_bro_kon
subroutine kom_bro_ini(kdt, dio_rea, dio_img)
class(kom_bro), intent(out) :: kdt
real(rp), intent(in) :: dio_rea
real(rp), intent(in) :: dio_img
kdt%rea = dio_rea
kdt%img = dio_img
end subroutine kom_bro_ini
function uzm_pod_rea( kdt ) result( rez )
class(kom_bro), intent(in) :: kdt
real(rp) :: rez
rez = kdt%rea
end function uzm_pod_rea
function uzm_pod_img( kdt ) result( rez )
class(kom_bro), intent(in) :: kdt
real(rp) :: rez
rez = kdt%img
end function uzm_pod_img
function kom_bro_sab( kdt, bro ) result( rez )
class(kom_bro), intent(in) :: kdt
class(kom_bro), intent(in) :: bro
type(kom_bro) :: rez
rez%rea = kdt%rea + bro%rea
rez%img = kdt%img + bro%img
end function kom_bro_sab
end module mod_kompleks
program kompleksni_broj
use, non_intrinsic :: mod_kompleks
implicit none
type(kom_bro) :: broj_01, broj_02, broj_03
broj_01 = kom_bro(1.1_rp,2.2_rp)
print '(1x,f4.2,1x,"j",1xf4.2)', broj_01%uzm_rea(), broj_01%uzm_img()
broj_02 = kom_bro(3.3_rp,4.4_rp)
print '(1x,f4.2,1x,"j",1xf4.2)', broj_02%uzm_rea(), broj_02%uzm_img()
broj_03 = broj_01 + broj_02
print '(1x,f4.2,1x,"j",1xf4.2)', broj_03%uzm_rea(), broj_03%uzm_img()
end program kompleksni_broj
私の意図はkom_bro_sab
、mod_kompleks
モジュール外のプロシージャへのアクセスを無効にすることです。メインプログラムの実数部と虚数部の値を使用して複素数を作成する場合は、komという単語を入力した後、手順を選択する機会があります。kon_bro
もちろん、これは必要ですが、その関数の横に表示されます。手順を選択する機会kom_bro_sab
。どうすればこれを防ぐことができますか(プロシージャkom_bro_sab
と演算子のみを表示したい+
)?タイプバインドされたプロシージャがプライベートであったとしても、取得したもののスクリーンショットを追加します。
オーバーロードoperator(+)
が機能するために
broj_03 = broj_01 + broj_02
考慮すべき3つの異なる側面があります。
kom_bro_sab
kom_bro_sab
operator(+)
Each of these has its own accessibility, and is a distinct thing.
Look at the statement we have. In
broj_03 = broj_01 + broj_02
we can see that when we consider the generic operator(+)
we have left-hand side class(kom_bro)
and right-hand side class(kom_bro)
: we have a match to the specific type-bound procedure kom_bro_sab
. We can make this assessment outside the module because this generic interface is public. This resolution does not need the specific type-bound procedure to be public.
Assuming the binding name is accessible, this previous statement can be written as a reference to a specific type-bound procedure looking like
broj_03 = broj_01%kom_bro_sab(broj_02)
which finally, assuming the module procedure is accessible, looks like
broj_03 = kom_bro_sab(broj_01, broj_02)
We can independently control access of each of these things.
質問のコードでは、特定のバインディングがkom_bro_sab
プライベートになっていますが、モジュールkom_bro_sab
のデフォルトのアクセス可能性がパブリックであるため、モジュールプロシージャはパブリックです。
ジャックの答えは、デフォルトのアクセシビリティをプライベートにする方法、またはデフォルトのアクセシビリティをパブリックにしてモジュールプロシージャをプライベートにする方法を示しています。特定の汎用バインディングへの必要なアクセスをすでに指定しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加