logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zaimplementować metodę dodaj() w klasie C do sumowania tablic obiektów A i B?

denooky 06 Kwi 2005 20:08 1205 5
REKLAMA
  • #1 1381901
    denooky
    Poziom 20  
    Posty: 497
    Pomógł: 3
    Ocena: 26
    Witam. Mam pewien problem... ponizej znajduje sie fragment kodu, z definicja klasy. Jak zdefiniowac funckje dodaj(); ktora jest elementem skladowym klasy, by sumowala poszczegolne elementy tablic z obiektow A i B? Generalnie chodzi o to, by tablica obiektu C skladala sie z elementow bedacych suma poszczegolnych elementow tablic obiektow A i B. Wazne jest to, by funckja dodaj(); byla skladowa klasy. Problem sprowadza sie do operacji wewnatrz klasy i na to nie mam zadnego pomyslu... Da sie w ogole takie cos zrobic? Jesli ktos pomoze, to bede wdzieczny, z gory dziekuje za pomoc. Pozdrawiam!

    class costam {
    private:
    int tablica[10];
    public:
    void costam(void);
    void dodaj();
    };

    int main() {
    class costam A, B, C;
    return 0;
    }
  • REKLAMA
  • #2 1382648
    pallid
    Poziom 20  
    Posty: 155
    Pomógł: 57
    Ocena: 6
    Sposobow jest kilka:
    1. Jesli to nie musi byc funkcja dodaj(), wystarczy przeciazyc operator sumowania:
    
    Klasa {
      private:
        int wartosc;
      public:
        Klasa operator + (const Klasa);
        //...
    };
    
    //...
    Klasa Klasa :: operator + (const Klasa arg) {
      Klasa r;
        r.wartosc = wartosc + arg.wartosc;
      return r;
    }
    //...
    int main() {
    Klasa a, b, c;
    c = a + b;
    return 0;
    }
    

    2. Bez przeciazania operatorow
    
    Klasa {
    //...
      Klasa dodaj (const Klasa);
    }
    //...
    //i odwolanie
    c = a.dodaj(b);
    

    3. Mozna tez sprobowac przekazywac wskazniki do tablic, np. int* dodaj(int*). Problem moze jednak sprawic zakres dostepu private.
  • REKLAMA
  • #3 1382925
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Deklaracja zależy od tego co ma się dziać z wynikiem tego sumowania.
  • REKLAMA
  • #4 1419326
    denooky
    Poziom 20  
    Posty: 497
    Pomógł: 3
    Ocena: 26
    Dziekuje za poprzednie odpowiedzi.. ale ciagnac dalej problem klas mamy cos takiego:

    int main() {
    class macierz **A;
    for(int i=0;i<50;i++)
    A[i]=new macierz(3,3); // (3,3) - rozmiar macierzy
    delete A;
    return 0;
    }

    Dlaczego proba zaalokowania wiecej niz kilkadziesiat (w tym przypadku 50) obiektow typu class macierz konczy sie niepowodzeniem, tzn program nagle sam sie zamyka, nie zglaszajac zadnego bledu? I dlaczego sytuacja ta, rozwiazana w ponizszy sposob przynosi dobry efekt, program pracuje poprawnie:

    int main() {
    class macierz *A[200];
    for(int i=0;i<200;i++)
    A[i]=new macierz(3,3);
    delete A;
    return 0;
    }

    Z gory wielkie dzieki za pomoc! Pozdr
  • REKLAMA
  • Pomocny post
    #5 1419945
    pallid
    Poziom 20  
    Posty: 155
    Pomógł: 57
    Ocena: 6
    Proba zaalokowania wiecej niz jednego elementu klasy macierz konczy sie niepowodzeniem, tylko jeszcze nie widac efektow. Zmienna zadeklarowana jako class macierz **A jest wskaznikiem na wskaznik, czyli etykieta, ktora wskazuje na jakis adres w pamieci, pod ktorym przechowywany jest jakis inny adres (elementu docelowego). Inaczej jest to tez jednoelementowa tablica wskaznikow (odwolanie A[0]).
    Gdy probujesz zapisac drugi element (A[1]) to dostajesz sie w teoretycznie przypadkowe miejsce (praktycznie lezy ono najczesciej w okolicach poprzeniego). Program wysypuje sie, bo zapisujesz obszar w pamieci, z ktorego cos juz korzysta.
    Deklaracja class macierz *A[200] nie powoduje bledu, bo za jej pomoca rezerwujesz sobie obszar w pamieci o rozmiarze 200*sizeof(macierz *), do ktorego potem zapisujesz wskazniki.

    Rozwiazanie:
    Musisz zaalokowac miejsce na przechowywanie wskaznikow do tworzonych obiektow:
    - jesli znana jest z gory ilosc obiektow klasy macierz to skorzystaj z drugiego sposobu jaki podales.
    - jesli ilosc obiektow nie jest znana, skorzystaj z dynamicznej alokacji pamieci (malloc()/realloc() albo new macierz[rozmiar]).
    HTH.
  • #6 1419975
    Nemo
    Poziom 31  
    Posty: 2078
    Pomógł: 9
    Ocena: 72
    Rety, przecież to jest C++. A dlaczego nie użyć operatorów new do tworzenia obiektów (i zapisywania wskaźników w tablicy), a delete do ich kasowania?
    Pozdrawiam.
REKLAMA