いつもお世話になります
標準モジュール内でPublic宣言した構造体を引数にして、あるクラスの中の関数に渡して計算処理をさせたいのですがうまくいきません。
全く同じ内容の質問がVB3000 2004/05/11にあったのですが、この辺に関して初心者なので回答の意味と更に質問した方が
『Module AAA』→『Public AAA』とすることで解決したという事も分かりません。
内容が同じなのでその時の質問を例に記述させてもらいますと
---標準モジュール---
Module AAA
Public Structure BBB
Dim CCC as String
End Structure
End Module
--- あるクラス ---
Public Class DDD
〜省略〜
Public sub EEE(ByVal FFF as BBB)
〜
End sub
End Class
---------------------
実際に上記の「Module AAAをPublic AAA」にしても名前空間のステートメントが無効というエラーになってしまいます。
構造体BBBをクラスDDDの中でPublicに宣言してエラーを回避したという意味なのかと思うのですが、
それでは、DDDのインスタンスをd、標準モジュールの構造体BBBのインスタンスをbとし、
d.EEE(b)と記述すると「Moduleの構造体をクラスDDDの構造体に変換できない」というエラーになります。
多分私のやり方がトンチンカンなのでしょうが、具体的解決方法を教えてください。或はそもそも標準モジュールで宣言した構造体をクラスの引数にする事自体がおかしなことなのでしょうか?
> 『Module AAA』→『Public AAA』とすることで解決したという事も分かりません。
『Public AAA』ではなく、『Public Module AAA』です。
> End Class
『End』ではなく、『End』にしてください。
> 標準モジュール内でPublic宣言した構造体を引数にして、
「Module AAA」は、省略された記法であり、この場合は、
「Friend Module AAA」の意味で解釈されます。
Publicメソッドの引数に利用できるのは、Publicスコープの
データ型に限られます。Friendスコープの型は指定できません。
魔界の仮面弁士さんありがとうございます
解決しました。
しかし、本当の意味がまだ良く分かっていないのです。
今まで、標準モジュールでPublicで宣言した変数は、どこからでも自由に使えると思っていたのですが、
クラスから参照できる変数はPublic Module で宣言する必要があるという
事と理解してよいですか?。
なにせ50才半ばからC++を勉強初めたので、この辺のところが今ひとつ飲み込めなくて弱っています。
でも、こうやって質問して助けて頂くのは本当にありがたく感謝いたします。
変数のスコープが入れ子になってる場合ですね?。
この場合、Friend は身内(同一プロジェクト内)で有効です。
裏を返せば身内しかアクセスさせたくないってことです。
そのメンバである構造体だけが勝手にプロジェクトの外側
からのアクセスを許したら困りませんか?Module AAA は
見えないのに Structure BBB は見える。名前空間の指定を
考えてください。
AAA.BBB
AAA は見えません(存在しないのと同じ)。BBB は見えます。
プロジェクトの外から見ると矛盾するでしょ?そういう矛盾を
含んだ形で定義することを許さないってだけのことです。
[参考]変数とメソッドのスコープ
http://www.microsoft.com/japan/msdn/net/upgrade/methodscope.asp
こっちの方が分かり易いかな?
http://homepage1.nifty.com/rucio/main/kiso/Scope.htm
>標準モジュールでPublicで宣言した変数は、どこからでも自由に使えると思っていたのですが、
標準モジュールだからでは無く、Public で宣言された入れ物としての
モジュールならです。別に Public なクラスでも良いんです。
特攻隊長まるるうさん、ありがとうございます
霧が立ち込めていた中で、霧が晴れ、雲の切れ間に青空が見えてきたような気がします。
残念ながら、まだ100%理解したとはいえませんが、やっていくうちに分かってくると思います。
また宜しくお願いします。
ツイート | ![]() |