konstruktor w operatorze ?

0

Witam. Napisalem ostatnio do szkoly popularna klase Macierze i wszystko dzial okej ,ale zauwazylem cos co mnie zaciekawilo i nie do konca rozumiem. Mam w klasie przeciazony operator + a wewnatrz niego tworze nowa macierz ,ktora wywoluje tak jakby polowe konstruktora. Moze wkleje kod

  public Macierz(int wys, int szer) 
        {            
            M = szer; 
            N = wys; 
            matrix = new int[N, M]; 

            for (int i = 0; i < N; i++) 
            { 
                for (int j = 0; j < M; j++) 
                { 
                    Console.WriteLine("podaj wartość pola dla komórki ({0},{1})", i + 1, j + 1); 
            = Convert.ToInt32(Console.ReadLine()); 
                    matrix[i, j]  

                } 
            } 
        }
0
  public Macierz(int wys, int szer) 
        {            
            M = szer; 
            N = wys; 
            matrix = new int[N, M]; 

            for (int i = 0; i < N; i++) 
            { 
                for (int j = 0; j < M; j++) 
                { 
                    Console.WriteLine("podaj wartość pola dla komórki ({0},{1})", i + 1, j + 1); 
                     matrix[i, j] = Convert.ToInt32(Console.ReadLine()); 
                  
                } 
            } 
        }

 public static Macierz operator +(Macierz matrix1, Macierz matrix2) 
        { 
                   /// ?? półwywołanie konstruktora??  
            Macierz macierz_dodajaca = new Macierz(matrix1.N, matrix1.M);

            if (matrix1.N == matrix2.N && matrix1.M == matrix2.M) 
            { 
                for (int i = 0; i < macierz_dodajaca.N; i++) 
                { 

                    for (int j = 0; j < macierz_dodajaca.M; j++) 
                    { 
                        macierz_dodajaca.matrix[i, j] = matrix1.matrix[i, j] + matrix2.matrix[i, j]; 
                    } 

                } 

            } 
            else            
                throw new Exception("dodawanie niewykonalne"); 
            return macierz_dodajaca;          
            
        }

I pozniej w programie kiedy dodaje macierze, to jest wywolywany ten moj konstruktor, jednak wypelnia tylko pola, a fory sa juz omijane. Logicznie powinien wywołac się cały konstruktor ,czyli w pewnym momencie powinno się włączyć "ręczne" wypełnianie macierzy lub ewentualnie powinien wyskoczyc jakis blad. W sumie akurat dobrze ze nic takiego sie nie stalo ,ale z czystej ciekawosci pytam ,bo moze jest jakies sensowne wytlumaczenie.

0
lamus napisał(a)

"podaj wartość pola dla komórki ({0},{1})", i + 1, j + 1);

Co to do jasnej Anielki jest "wartość pola dla komórki"? [rotfl]
Gdybym był matematykiem, to za taki tekst bym Ci chyba coś urwał :P

lamus napisał(a)

I pozniej w programie kiedy dodaje macierze, to jest wywolywany ten moj konstruktor, jednak wypelnia tylko pola, a fory sa juz omijane. Logicznie powinien wywołac się cały konstruktor ,czyli w pewnym momencie powinno się włączyć "ręczne" wypełnianie macierzy lub ewentualnie powinien wyskoczyc jakis blad. W sumie akurat dobrze ze nic takiego sie nie stalo ,ale z czystej ciekawosci pytam ,bo moze jest jakies sensowne wytlumaczenie.

Ale o co Ci właściwie chodzi?
Jeśli zrobisz coś takiego:

Macierz m1 = new Macierz(2, 2);
Macierz m2 = new Macierz(2, 2);
Macierz suma = m1 + m2;

Mam nadzieję, że o to Ci chodzi... to 3 razy wyskoczy Ci seria pytań, czy jak to Ty nazywasz "fory".  Tylko nie wiadomo po co. Powinieneś mieć konstruktor, który nie pobiera żadnych danych od użytkownika, żeby móc tworzyć takie "puste" macierze do operowania na nich. Ja w ogóle oddzieliłbym konstruktor od pobierania danych i zrobiłbym do tego oddzielną metodę, byłoby wtedy bardziej po ludzku.

Co do tego:
<code class="c#">macierz_dodajaca.matrix[i, j] = matrix1.matrix[i, j] + matrix2.matrix[i, j];

Nie wpadłbym nigdy, że tak się da :) No, ale faktycznie w końcu to ta sama klasa jest, więc do prywatnego pola można się odwołać. Ale i tak tak nie będę robił. Jakoś to tak niehermetycznie wygląda.
Niemniej jednak radzę Ci przeciążyć też indeksery, żebyś mógł odwoływać się do elementów macierzy bezpośrednio np. "macierz_dodajaca[i, j] = matrix1[i, j] + matrix2[i, j];" - będzie ładniej :)
Poza tym chyba taka idea jest, żeby klasa Macierz była opakowaniem dla tablicy wzbogacającym je o operacje.

0
somekind napisał(a)

Gdybym był matematykiem, to za taki tekst bym Ci chyba coś urwał :P

Gdybym był polonistą ,to za czytanie ze zrozumieniem też bym coś urwał :D Po pierwsze akurat ten kod nie jest do konca moj( w sensie to kod przerobionego mojego programu), a po drugie wiem ze nie jest najlepszy i niepowinno sie tego pisac w konstruktorze ,ale w ogole nie o tym jest temat...

somekind napisał(a)

Ale o co Ci właściwie chodzi?
Jeśli zrobisz coś takiego:

Macierz m1 = new Macierz(2, 2);
Macierz m2 = new Macierz(2, 2);
Macierz suma = m1 + m2;

> Mam nadzieję, że o to Ci chodzi... to 3 razy wyskoczy Ci seria pytań, czy jak to Ty nazywasz "fory".  Tylko nie wiadomo po co.


No właśnie widać ,że nie czytasz co napisałem.<b> Moim problemem jest to ,że jak napisze ten podany przez ciebie kod to seria pytań wyskakuje mi 2 razy ,a nie jak powinno 3 i nie wiem czemu tak sie dzieje.</b>Przy tworzeniu macierzy m1 i m2 wyskakuje seria pytan, a przy suma sa podawane rozmiary tablicy i wszystko jest poprawnie dodane, ale pytan nie ma.


 > ##### somekind napisał(a)
> Co do tego:
> <code class="c#">macierz_dodajaca.matrix[i, j] = matrix1.matrix[i, j] + matrix2.matrix[i, j];

Nie wpadłbym nigdy, że tak się da :) No, ale faktycznie w końcu to ta sama klasa jest, więc do prywatnego pola można się odwołać. Ale i tak tak nie będę robił. Jakoś to tak niehermetycznie wygląda.
Niemniej jednak radzę Ci przeciążyć też indeksery, żebyś mógł odwoływać się do elementów macierzy bezpośrednio np. "macierz_dodajaca[i, j] = matrix1[i, j] + matrix2[i, j];" - będzie ładniej :)

nie bardzo rozumiem :) Wydawało mi się ,że tylko tak sie da i tak najlatwiej :P Ale to moze dlatego ,że nie korzystałem za czesto z indekserow i sie za bardzo na nich nie znam. Bylbym wdzieczny jakbys napisal co trzeba napisac zeby dodawac macierze w ten sposob.

pozdrawiam

0
lamus napisał(a)

a po drugie wiem ze nie jest najlepszy i niepowinno sie tego pisac w konstruktorze ,ale w ogole nie o tym jest temat...

Wiem, że temat nie jest, to była taka moja (jestem przekonany, że dobra) rada w ramach dygresji. Bo dzięki temu konstruujesz sobie Macierz (tylko jej rozmiar), a potem możesz uzupełniać na różne sposoby - pobierając liczby od użytkownika, wczytując z pliku, losując, itp. To jest bardziej przyszłościowe.

lamus napisał(a)

No właśnie widać ,że nie czytasz co napisałem. Moim problemem jest to ,że jak napisze ten podany przez ciebie kod to seria pytań wyskakuje mi 2 razy ,a nie jak powinno 3 i nie wiem czemu tak sie dzieje.Przy tworzeniu macierzy m1 i m2 wyskakuje seria pytan, a przy suma sa podawane rozmiary tablicy i wszystko jest poprawnie dodane, ale pytan nie ma.

Ale, ja właśnie przeczytałem dokładnie, dlatego dopytuję. Zrobiłem sobie projekt, wkleiłem tam Twój kod i mnie pyta 3 razy. Jeśli Ciebie nie, to bardzo dziwne, że program nie robi tego, co w nim jest zaprogramowane. Może pokaż więcej kodu?
I nie imputuj mi czytania bez zrozumienia ;)

lamus napisał(a)

nie bardzo rozumiem :) Wydawało mi się ,że tylko tak sie da i tak najlatwiej :P

Chodziło mi o to, że w tej linijce
macierz_dodajaca.matrix[i, j] = matrix1.matrix[i, j] + matrix2.matrix[i, j];

odwołujesz się do pól prywatnych (matrix) zewnętrznych obiektów (matrix1 i matrix2), a nie wiedziałem, że tak się da. Tzn. nigdy tak nie robiłem, bo i po co?

Co do indekserów - nie mów, że z nich nie korzystasz, bo nie da się używać tablic bez indekserów :P
Są to właściwości, które trzeba przeciążyć. Nie podaje się im własnej nazwy, wygląda to mniej więcej tak:
<code class="c#">
public int this[int i, int j]
{
     get
     {
          //sugeruję sprawdzić czy podany indeks nie wykracza poza zakres i ewentualnie
          //wyrzucić IndexOutOfRangeException();
          //a jeśli wszystko dobrze, to zwrócić element wewnętrznej, prywatnej tablicy o indeksach i i j
          return matrix[i, j];
     }
     set
     {
           //a tu analogiczne czynności do ustawienia wartości elementu
     }
}

Mam nadzieję, że wszystko jasne.
Powodzenia i pozdrawiam :)

0

Mozliwe ,ze rzeczywiscie za pierwszym razem zrozumiałeś ,jednak już kilka razy mi się tu zdarzyło ,że pytałem o coś ,a dostawałem dużo odpowiedzi i rad tylko nie to o co pytałem. Sorry.

Troche namieszałem. Okazało się ,że rzeczywiście , konstruktor jest wywoływane 3 razy , jednak w programie kumpla (tym moim przerobionym ,którego kod podałem). Moj był podobny ,to byłem pewien ,że przepisał te funkcje, a jak teraz otworzyłem swój projekt to sie okazało ,że ja wewnątrz operatora + miałem:

MacPro mac = new MacPro();

        mac.N = mac1.N;
        mac.M = mac1.M;
        mac.Macierz = new int[mac.N, mac.M];

a ,że wczesniej jeszcze konstruktor bezargumentowy ,więc u mnie taki problem z dodawaniem nie występował, a u niego (o czym mi nie powiedział :/ ) tak. No nie ważne, poprostu nie zauważyłem,że mam inaczej.Sorry za kłopot.



Natomiast jeśli chodzi o te indeksery , to mnie zaciekawiłeś :) Ucze się C# właściwie od niedawna i czytałem o indekserach ,jednak uznałem ,że nie do konca rozumiem kiedy mają mi się przydać i że narazie mi się nie przydadzą ,to przeszedłem do nast. rozdziału (rzeczywiscie nie potrzebowałem ich i w tym programie również) i pozniej nie zwracałem na nie uwagi.

Dzieki Tobie zauważyłem , do czego one naprawde służą i że mogą być pomocne (chociaż nie konieczne). Przy nastepnej okazji napewno z nich skorzystam. Tylko napisz mi jeszcze czy mam racje ,że indeksery są tak jakby jednorazowe, czyli że jak już mamy 2 tablice(lub więcej) w klasie ,to możemy tylko na podstawie jednej z nich zindeksować obiekt (nie wiem czy poprawnie sie wyrazilem ,ale wiesz co mam na mysli).

Pozdrawiam i dzieki za pomoc.
0
lamus napisał(a)

Tylko napisz mi jeszcze czy mam racje ,że indeksery są tak jakby jednorazowe, czyli że jak już mamy 2 tablice(lub więcej) w klasie ,to możemy tylko na podstawie jednej z nich zindeksować obiekt (nie wiem czy poprawnie sie wyrazilem ,ale wiesz co mam na mysli).

No raczej tak. Odwołując się do zaindeksowanego elementu swojej klasy możesz zwrócić jakiejś jej konkretne pole, np. właśnie element tablicy. Więc wygląda to na "jednorazowe".
Ja indekserów także używałem w programie do macierzy, poza tym nie znalazłem dla nich nigdy zastosowania :)
Pozdrawiam takoż.

1 użytkowników online, w tym zalogowanych: 0, gości: 1