2010-07-21 2 views
6

Когда я пытаюсь создать объект класса формы в классе формы, он дает исключение в виде stackoverflow. Однако, когда я объявляю объект класса формы внутри метода, он отлично работает. код выглядит следующим образом:исключение stackoverflow в классе формы

namespace WindowsFormsApplication6 
{ 
    public partial class Form1 : Form 
    { 

     **Form1 f1 = new Form1();**//gives stackoverflow exception....... 

     char[] ar = new char[15]; 
     int flag = 0, end; 
     double val1, val2, res; 
     string oprt; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void masters(object sender, EventArgs e) 
     { 
      ar[i] = char.Parse(((Button)sender).Text); 
      if (char.IsDigit(ar[i])) 
      { 
       if (flag != 0) 
       { 
        if (textBox1.Text == oprt) 
        { 
         textBox1.Clear(); 
        } 

       } 
       else 
       { 
        if (end == 1) 
        { 
         textBox1.Clear(); 
         end = 0; 
        } 
       } 
       Button ansbox = sender as Button; 
       textBox1.Text += ansbox.Text; 

      } 
      else if (char.IsSymbol(ar[i])) 
      { 
       if (textBox1.TextLength != 0) 
       { 
        val1 = double.Parse(textBox1.Text); 
        textBox1.Clear(); 
        Button bt = sender as Button; 
        if (bt != null) 
         textBox1.Text = bt.Text; 
        oprt = bt.Text; 
        // dot.Enabled = true; 
        flag = 1; 
       } 
      } 
     } 





     private void button14_Click(object sender, EventArgs e) 
     { 
      if (textBox1.TextLength != 0) 
      { 
       val2 = double.Parse(textBox1.Text); 
       switch (oprt) 
       { 
        case "+": res = val1 + val2; 
         break; 
        case "-": res = val1 - val2; 
         break; 
        case "*": res = val1 * val2; 
         break; 
        case "/": res = val1/val2; 
         break; 
       } 


       textBox1.Text = res.ToString(); 
       flag = 0; 
       end = 1; 
      } 
     } 
    } 
} 

} 
+7

+1 исключение stackoverflow! – Fabian

ответ

4

вы создаете частный экземпляр Form1, когда создается Form1, так что это своего рода бесконечный цикл:

Где-то в вашем коде вы создаете свой первый экземпляр Form1. Когда этот экземпляр создает, он создает новый экземпляр Form1. Этот экземпляр также создает экземпляр Form1 и снова, и снова и т.д.

Так что, когда создается экземпляр все переменные инициализируются и когда вы объявите их, как это: Form1 f1 = new Form1() это автоматически instatiates новый экземпляр формы.

Я предлагаю вам не новый экземпляр вашего Form1 внутри Form1, но если вам действительно нужно это создать метод, чтобы сделать экземпляр:

Измените Form1 f1 = new Form1(); в Form1 f1;. И создать метод:

public void InstantiateNewForm1Instance() 
{ 
    f1 = new Form1(); 
} 

Но: НЕ вызывать этот метод в конструкторе! Или у вас будет такая же проблема :-)

1

Форма создается, затем обрабатывает частные поля, которые создают экземпляр формы1, который затем создает частные поля (find form1), который затем создает экземпляр этого объекта и процессов частные поля, продолжающиеся.

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

Почему, когда в форме1 вам нужен другой экземпляр той же формы?

+2

Erm ... безумие? – Lazarus

2

Это потому, что каждый раз, когда вы создаете экземпляр своего класса, он создает еще один экземпляр вашего класса и так далее ... и так далее ... и так далее ...

Другими словами, имеют бесконечную рекурсию при попытке создать экземпляр вашего класса.

Вам нужно добавить какой-то контроль вокруг того, создается ли новый экземпляр Form1 во время строительства. Простой (и не полное) решение было бы что-то вроде:

public partial class Form1 : Form 
{ 
    Form1 f1; 

    public Form1() : this(false) 

    public Form1(bool createNewInstance) 
    { 
     if(createNewInstance) 
      f1 = new Form1(); 
     else 
      f1 = null; 
    } 
} 
1

Может быть, потому что Form1 пытается создать еще одну Form1, который в свою очередь, пытается создать еще одну Form1 и т.д.?

0

Если каждый класс Form1 содержит один новый экземпляр класса Form1, при попытке его создания у вас должно быть исключение переполнения стека.

Вы можете видеть это более четко, пытаясь нарисовать объекты на листе бумаги, имитируя пространство, которое они занимают в памяти, и пространство, занимаемое их детьми, - но помните, что каждая форма 1 должна быть одного размера!

6

Создание экземпляра Form1 приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1 что приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который приведет к тому, что свойство f1 будет инициализируется экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который будет вызывают инициализацию свойства f1 экземпляром F orm1, который приведет к инициализации свойства f1 экземпляром Form1, который приведет к инициализации свойства f1 экземпляром Form1, который ... Stack Overflow!

В рамках метода в классе «f1» будет локальным и существует только для жизни вызова. Если вы не назовете тот же метод на экземпляр Form1, то не будут созданы последующие Form1.

1

Если вы находитесь в новом конструкторе Form1, экземпляр Form1 уже создается. Таким образом, прежде чем он будет создан, вы создадите еще один, затем он сделает то же самое. До того, как ваша программа загрузится, слишком много form1s идут в стеке ... переполняют стек.

Смежные вопросы