Avatar
gizzycz
Člen
Avatar
gizzycz:

Zdravím,
mohl by mi někdo poradit proč dostávám chybu System.StackO­verflowExcepti­on ? Zkouším první věci pomocí OOPečka a moc mě nenapadá co jsem udělal špatně:

class Balloon:Form1
public void Fly()
{
balloon_grey.Lo­cation = new Point(balloon_gre­y.Location.X,ba­lloon_grey.Lo­cation.Y - 3);
}

public partial class Form1 : Form
private void timer1_Tick(object sender, EventArgs e)
{
greyBalloon.Fly();
}

Z celého kódu jsem vybral jen ten útržek po kterém mě to začalo tuto chybu vypisovat...možná by metoda Fly měla vracet ty souřadnice do Form1...

 
Odpovědět 19.6.2014 22:54
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na gizzycz
Jan Vargovský:

Pošli nám stacktrace z té vyjímky nebo více kódu.

 
Nahoru Odpovědět 19.6.2014 23:19
Avatar
gizzycz
Člen
Avatar
gizzycz:

namespace Balloon_Shooter
{
class Grey_Balloon:Ba­lloon
{
public Grey_Balloon(int speed, int thickness)
: base(speed, thickness)
{
}
}
}

namespace Balloon_Shooter
{
class Balloon:Form1
{
protected int speed;
protected int thickness;

public Balloon(int speed, int thickness)
{

}
public void Fly()
{
balloon_grey.Lo­cation = new Point(balloon_gre­y.Location.X,ba­lloon_grey.Lo­cation.Y - 3);
}
}
}

namespace Balloon_Shooter
{
public partial class Form1 : Form
{
public Form1()
{
InitializeCom­ponent();
}
Grey_Balloon greyBalloon = new Grey_Balloon(2,1);

ImageList imgList = new ImageList();
int imgIndex;
private void timer1_Tick(object sender, EventArgs e)
{
greyBalloon.Fly();
}
private void balloon_grey_Clic­k(object sender, EventArgs e)
{
timer2.Start();

}
private void timer2_Tick(object sender, EventArgs e)
{
if (imgIndex == imageList1.Ima­ges.Count - 1)
{
timer2.Stop();
System.Media.Sou­ndPlayer player = new System.Media.Sou­ndPlayer();
player.SoundLo­cation = "balloon_explo­sion.wav";
player.Play();

balloon_grey.Dis­pose();
}
balloon_grey.Image = imageList1.Ima­ges[imgIndex++];
}
}
}

Spousta veci tam je rozdelanych, tak se nelekni.

 
Nahoru Odpovědět 19.6.2014 23:28
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na gizzycz
Jan Vargovský:

Zkus to vložit jako zdroják.

EDIT: Co na to tak letmo koukám, tak nechápu tvoji hierarchii. Proč všechny třídy dědí z toho Form1?

public Balloon(int speed, int thickness)
{

}

Konstruktor, který nepřiřazuje hodnoty.

Každopádně k chybě. Díky té dědičnosti vytváříš nekonečně mnoho objektů. Ty vytvoříš tohle:

Grey_Balloon greyBalloon = new Grey_Balloon(2,1);

A protože ta třída je zase z Form1, tak se to takhle vytváří dokud ti nedojde paměť.

Jestli nechápeš, tak děláš tohle:
Vytvoříš instanci greyBalloon, ta si uvnitř vytvoří instanci na greyBalloon, ta si uvnitř vytvoří instanci na greyBalloon, ta si uvnitř vytvoří instanci na greyBalloon, ...

Editováno 19.6.2014 23:34
 
Nahoru Odpovědět  +1 19.6.2014 23:29
Avatar
coells
Redaktor
Avatar
Odpovídá na gizzycz
coells:
Grey_Balloon greyBalloon = new Grey_Balloon(2,1);

rekurzivni konstruktor neni dobry napad

 
Nahoru Odpovědět 19.6.2014 23:34
Avatar
gizzycz
Člen
Avatar
gizzycz:

Grey_Balloon dedi z Balloon kde chci mit vsechny ty metody ktere tam pozdeji vytvorim to same s promennyma a Ballon trida dedi z Formu jen proto, protoze me v tu chvili nenapadlo jakym zpusobem se dostanu jinak ke pictureboxu (balloon_grey) z formulare

 
Nahoru Odpovědět 19.6.2014 23:38
Avatar
Odpovídá na gizzycz
Luboš Běhounek (Satik):

PictureBox si předej třeba přes konstruktor (musíš si ho pak někde v Baloonu udržovat).

Nahoru Odpovědět 20.6.2014 10:07
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.