- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

D Edit

ネストしたクラスからは、外側のメンバにアクセスできるが、
その反面、外部から直接生成できない。

staticにすると、外部から直接生成できるようになるが、
外側のメンバにはアクセスできなくなる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void main()
{
  class Foo
  {
    int value;

    class Bar
    {
      int xyzzy()
      {
        return value;
      }
    }
    
    int xyzzy()
    {
      Bar bar = new Bar;
      return bar.xyzzy();
    }

    static class Bar2
    {
      int xyzzy()
      {
        //return value;  コンパイルエラー
        return 5678;
      }
    }
  }

  Foo foo = new Foo;
  foo.value = 1234;
  printf("%d\n", foo.xyzzy());

  //Foo.Bar bar = new Foo.Bar;    コンパイルエラー
  
  Foo.Bar2 bar2 = new Foo.Bar2;  // ok
  printf("%d\n", bar2.xyzzy());
}

出力結果

1234
5678

Delphi Edit

できるけど、すごく挙動不審。
外側にアクセスできるが、正しい値にはならない。
staticにしか扱わないほうがいい模様。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
program main;

{$APPTYPE CONSOLE}
uses SysUtils;
  
type
  TFoo = class
  type
    TBar = class
      function Xyzzy: Integer;
    end;
  private
    FValue: Integer;
    function Xyzzy: Integer;
  end;

function TFoo.Xyzzy;
var Bar: TBar;
begin
  Bar := TBar.Create;
  try
    Result := Bar.Xyzzy;
  finally
    FreeAndNil(Bar);
  end;
end;

function TFoo.TBar.Xyzzy;
begin
  Result := FValue;  // コンパイルエラーにならない
end;

var
  Foo: TFoo;
  Bar: TFoo.TBar;
begin
  Foo := TFoo.Create;
  try
    Foo.FValue := 1234;
    Writeln(Foo.Xyzzy);
  finally
    FreeAndNil(Foo);
  end;
  
  Bar := TFoo.TBar.Create;
  try
    Writeln(Bar.Xyzzy);
  finally
    FreeAndNil(Bar);
  end;
end.

出力結果

0
1234

だめだこりゃー


  • Delphi8(Win32は2005)からいけるはず。Dでいうstaticのみですが。 -- YT? 2005-07-15 02:26:13 (金)
  • いやー、上のコードだと、だめでした。どうやったらいけますかね? -- TOBY 2005-07-15 12:55:00 (金)
  • あー、わかりました。クラス内でtype使って宣言するのか! -- TOBY 2005-07-15 12:57:30 (金)


Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2005-07-15 Fri 14:15:10 JST (4455d)