Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Maty Matis
Člen
Avatar
Maty Matis:19.12.2018 17:01

Čaute, takže mám tu menší zádrheľ. Mám triedu 1 kde sú definované int A,B, potom triedu 2 s hlavným programom a triedu 3 s vedľajším programom. Hlavný program vyvolá funkciu z triedy 2, ktorý má prepísať int A,B, ale neprepíše ich..
CLASS 1

namespace TEST_CLASS
{
    class INFO
    {
        public int A = 100;
        public int B = 500;
    }
}

CLASS2

namespace TEST_CLASS
{
    class Program
    {
        static void Main(string[] args)
        {
            //CLASSES
            MORE M = new MORE();

            //STRUCT
            INFO I = new INFO();
            int volba;
            int koniec = 0;

            while (koniec != 1)
            {
                Console.Clear();
                Console.WriteLine("Choose what you need!");
                Console.WriteLine("You have: " + I.A + "A and " + I.B + "B.");
                Console.WriteLine("1.)More A\n2.)More B\n3.)END");
                volba = int.Parse(Console.ReadLine());


                switch (volba)
                {
                    case 1:
                        M.madeA();
                        break;

                    case 2:
                        M.madeB();
                        break;

                    case 3:
                        koniec = 1;
                        break;
                }
            }

        }
    }
}

CLASS 3

namespace TEST_CLASS
{
    class MORE
    {

        INFO I = new INFO();

        public void madeA()
        {
            Console.WriteLine("You made more A!");
            Console.ReadKey();
            I.A = I.A + 1;
        }

        public void madeB()
        {
            Console.WriteLine("You made more B!");
            Console.ReadKey();
            I.B = I.B + 1;
        }
    }
}

Zkusil jsem: Skúšal som to čo zatiaľ viem urobiť s tým - dať do jednej triedy premenne a do druhej hlavný program so static void pod ním, ale furt to robilo to iste. Keď som to ale dal takto:

switch (volba)
                {
                    case 1:
                    Console.WriteLine("You made more A!");
                        Console.ReadKey();
                        I.A = I.A + 1;
                        break;

                    case 2:
                     Console.WriteLine("You made more B!");
                                 Console.ReadKey();
                                 I.B = I.B + 1;
                        break;

                    case 3:
                        koniec = 1;
                        break;
                }

Tak to funguje... Teda okrem case 3 to funguje od začiatku, aj všetko, len to prepisovanie premennej.

Chci docílit: Chcem aby to fungovalo, ale chcem to mať v triedach aby som nemal jeden kód, ktorý nemá koniec.

 
Odpovědět
19.12.2018 17:01
Avatar
d4rkw34v3r
Tvůrce
Avatar
d4rkw34v3r:19.12.2018 17:16

Problém je v tom, že si vytvoříš instanci INFO v objektu MORE a potom provádíš akce na tý konkrétní instanci. Potom si ale v hlavním programu vytvoříš další instanci INFO, ze které poté zobrazuješ aktuální hodnoty. Ty samozřejmě zůstavájí stejné, protože je nijak nemodifikuješ.

Console.Clear();
Console.WriteLine("Choose what you need!");
Console.WriteLine("You have: " + M.A + "A and " + M.B + "B.");
Console.WriteLine("1.)More A\n2.)More B\n3.)END");
volba = int.Parse(Console.ReadLine());
 
Nahoru Odpovědět
19.12.2018 17:16
Avatar
Maty Matis
Člen
Avatar
Odpovídá na d4rkw34v3r
Maty Matis:19.12.2018 17:23

Ako to teda urobiť nech to funguje s 3 triedami?

 
Nahoru Odpovědět
19.12.2018 17:23
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na Maty Matis
d4rkw34v3r:19.12.2018 18:02

Do objektu MORE si můžeš předat objekt INFO, který vytváříš v hlavním programu( nebudeš ho vytvářet natvrdo v objektu MORE)

 
Nahoru Odpovědět
19.12.2018 18:02
Avatar
Maty Matis
Člen
Avatar
Odpovídá na d4rkw34v3r
Maty Matis:19.12.2018 18:07

Ako to urobím? Som fakt len začiatočník, tak toho moc neviem.

 
Nahoru Odpovědět
19.12.2018 18:07
Avatar
Marek Uhlik
Člen
Avatar
Odpovídá na Maty Matis
Marek Uhlik:19.12.2018 18:32

Můžeš např přes kontruktor ve třídě MORE viz:

private INFO info;
public MORE(INFO info)
{
        this.info = info;
}
 
Nahoru Odpovědět
19.12.2018 18:32
Avatar
Marek Uhlik
Člen
Avatar
Odpovídá na Maty Matis
Marek Uhlik:19.12.2018 18:40

A potom když to budeš vytvářet v main tak to budeš mít že

INFO i = new INFO();
MORE M = new MORE(i);
 
Nahoru Odpovědět
19.12.2018 18:40
Avatar
Maty Matis
Člen
Avatar
Odpovídá na Marek Uhlik
Maty Matis:20.12.2018 18:55

Furt mi to nefunguje. :/

 
Nahoru Odpovědět
20.12.2018 18:55
Avatar
Odpovídá na Maty Matis
Neaktivní uživatel:20.12.2018 19:35

Jak vypadá tvůj kód teď?

Nahoru Odpovědět
20.12.2018 19:35
Neaktivní uživatelský účet
Avatar
Odpovídá na Maty Matis
Michal Štěpánek:21.12.2018 8:42

Ako to urobím? Som fakt len začiatočník, tak toho moc neviem.

Nemyslíš, že by bylo lepší si pročíst tutoriál s OOP? Tam všechno to, co tady popisuješ je krásně vysvětlené.
Je zbytečné něco zkoušet naprogramovat jen pomocí dotazů na fóru, když tápeš v naprostých základech...
Pročti si tutoriál a pak to zkus naprogramovat znovu...

Nahoru Odpovědět
21.12.2018 8:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Filip Zeman
Tvůrce
Avatar
Filip Zeman:21.12.2018 17:14

Zdravím. Jak ostatní psali, problém je v tom, že ve třídě More vytvoříš jednu instanci:

INFO I = new INFO();

A znova ve třídě Program-Main

INFO I = new INFO();

Celou dobu pracuješ s tou první instancí, všechno do ní ukládáš atd. Jenomže pro vypsání chceš použít tu druhou instanci, která ale samozřejmě v sobě nic uložené nemá, protože jsi do ní taky nic neuložil. Ta druhá instance je úplně jiný objekt. Možné je to vyřešit přes konstruktor, jak už popsal Marek výše. Nebo to jde takto:

class MORE
{
    public void madeA(INFO info)
    {
        Console.WriteLine("You made more A!");
        Console.ReadKey();
        info.A = info.A + 1;
    }

    public void madeB(INFO info)
    {
        Console.WriteLine("You made more B!");
        Console.ReadKey();
        info.B = info.B + 1;
    }
}

Odstranil jsem instanci Info a metodám dal parametr typu INFO. Ten pak musíš později přiřadit.

A tady je ten tvůj switch.

MORE M = new MORE();
INFO I = new INFO();


    switch (volba)
    {
        case 1:
            M.madeA(I);
            break;

        case 2:
            M.madeB(I);
            break;

        case 3:
            koniec = 1;
            break;
    }

Teď se jak pro vypisování, tak pro ukládání používá ta totožná instance I, tudíž je vše v pořádku. Zavoláš metodu, ta do instance, kterou jsi metodě předal uloží data a pak následně ta stejná instance vypíše dané data.
Testováno, takže by to mělo fungovat.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
21.12.2018 17:14
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 11 zpráv z 11.