2017-08-29 2 views
0

クラスTにタイプTのフィールドがある場合、どのようにStackOverflow例外がありませんか?なぜなら、Tのオブジェクトを作成すると、その内部に別のTオブジェクトが存在することになり、そのTオブジェクトにはそれ自身のTオブジェクトがあります。クラスに同じクラスのフィールドがある場合、どのようにStackOverflowExceptionが発生しませんか?

私はこの質問が非常に混乱していることを知っています。これはおそらくこれらの質問に答えるウェブサイトではありませんが、私は興味があります。

編集:ので、ここで

わかりましたが、私が何を意味するかについて自分自身をより明確にする例です。

class T { 
    T t = new T(); 
} 

ですから、Tのオブジェクトを作成した場合、あなたはまた別のものを作成しますTのオブジェクトであり、次にTのオブジェクトを持ちます。私は何を求めているのですか?StackOverflowではないのはなぜですか?Tの無限のチェーンが作成されるからです。

それが役に立ったかどうかわかりません。

+2

どのような言語ですか? –

+0

私は彼(または彼女)が一般的で概念的な質問をしていると信じています。私はそれが有効なので、私はそれを+1したと思う。 –

+2

@Ed。それにもかかわらず、「一般的な、概念的な」答えはない。答えは言語によって異なります。 C++では、オブジェクトのサイズが無限大のため、*はスタックオーバーフローか、コンパイルエラーのいずれかです。 StackOverflowExceptionという用語は、Javaを強く示唆しています。 – EJP

答えて

2

一般に、ほとんどの(すべての)プログラミング言語では、複雑なデータ項目であるプロパティを持つオブジェクトは、割り当てられた領域内に完全なデータ項目を格納せず、ポインタまたはオブジェクトへの参照に十分な領域を割り当てます。その後

package T; 
use Moo; 
use Types::Standard -all; 
has ref_to_t => (is => 'ro', isa => InstanceOf['T']); # notice not "required" 
1; 

:Perlの用語を使用するには

my $obj1 = T->new; 
my $obj2 = T->new(ref_to_t => undef); 
my $obj3 = T->new(ref_to_t => $obj2); 

これは、状況はハルマゲドンにつながらない三つの方法を示しています。

  • $obj1を、これはどのようにPerlのMoo作品であるため、(持っています)ref_to_tのスペースはまったく割り当てられません。
  • $obj2にはスペースが割り当てられていますが、別のオブジェクトへの参照には十分な空き領域があります。つまり、nullまたは未定義です。
  • $obj3には、参照用にも領域が割り当てられています。
関連する問題