Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Operacja wewnątrz klasy w C

denooky 06 Apr 2005 20:08 1031 5
  • #1
    denooky
    Level 20  
    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;
    }
  • #2
    pallid
    Level 20  
    Sposobow jest kilka:
    1. Jesli to nie musi byc funkcja dodaj(), wystarczy przeciazyc operator sumowania:
    Code:

    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
    Code:

    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.
  • #3
    elektryk
    Level 42  
    Deklaracja zależy od tego co ma się dziać z wynikiem tego sumowania.
  • #4
    denooky
    Level 20  
    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
  • Helpful post
    #5
    pallid
    Level 20  
    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
    Nemo
    Level 31  
    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.