2014-02-15 4 views
1

Я получаю странную ошибку, которую я не могу вспомнить когда-либо раньше. Я пытаюсь сделать несколько меню для небольшой игры, но почему-то что-то не так с моей ссылкой на Form1.StackOverflowException был необработанным C#

Вот код:

public partial class Form1 : Form 
    { 
     Form2 Form2 = new Form2(); 
     Form3 Form3 = new Form3(); 
     public string difficulty = "Makkelijk"; 
     public string guesses = "Normaal"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void playButton_Click(object sender, EventArgs e) 
     { 
      //Form3.difficulty = difficulty; 
      //Form3.guesses = guesses; 
      Form3.Show(); 
      this.Hide(); 
     } 

     private void optionsButton_Click(object sender, EventArgs e) 
     { 
      Form2.Show(); 
      this.Hide(); 
     } 

     private void exitButton_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 
    } 

Form2:

public partial class Form2 : Form 
{ 
    Form1 Form1 = new Form1(); 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //Woord toevoeg query 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     //Form1.difficulty = comboBox1.Text; 
     //Form1.guesses = comboBox2.Text; 
     this.Close(); 
    } 
} 

Что плохого в этом?

Заранее благодарен.

ответ

0

Как уже говорилось, круговая инициализация вызывает ваше исключение.

Один из способов решения этой задачи - принять форму Form2 в качестве параметра конструктора Form1.

Form1 form; 

public Form2(Form1 form1) 
{ 
    form = form1; 
    InitializeComponent(); 
} 
4

Это потому, что вы инициализируете Form2 внутри Form1, а в Form2 вы инициализируете Form1, что делает циклическую инициализацию и вызывает исключение stackoverflow.

1

Вы создаете новый Form1 в ctor из Form2 и Form2 в ctor из Form1.
Каждый раз, когда вы создаете один из них, вы создаете и другое, и поэтому вы попадаете в бесконечный цикл, который evantualy заполняет ваш стек.

0

Первая строка Form1 создает новый Form2. Первая строка Form2 создает новый Form1. Это будет продолжаться до тех пор, пока у вас не закончится память.

Удалить

Form1 Form1 = new Form1(); 

из определения Form2.

+0

Но как я могу сделать повторения Form1 из формы2? – user2953063

+1

Передайте 'this' в качестве параметра конструктору формы2, когда вы вызываете его в form1 –

+0

Передайте ссылку на экземпляр Form1 в конструктор Form2. Что-то вроде 'Form2 form2 = new Form2 (ref this);' и конструктор Form2 будет 'public Form2 (ref Form1 form1) {this-> form1 = form1;}' –

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