Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dostęp do prywatnego pola przez statyczną metodę

Ostatnio zmodyfikowano 2016-07-08 11:32
Autor Wiadomość
mimotego
Temat założony przez niniejszego użytkownika
Dostęp do prywatnego pola przez statyczną metodę
» 2016-07-07 19:09:29
Witam!

Zmagam się z następującym problemem; jak statyczna metoda może dostać się do prywatnego pola w klasie? Mam klasę, która przechowuje pola: tablicę i jej rozmiar, oraz posiada metodę statyczną, która przyjmuje w argumencie jakąś liczbę i dodaje ją do wszystkich elementów tablicy. Kompletnie nie wiem jak to rozwiązać, może ktoś ma jakieś sugestie?

Pozdrawiam.
P-149746
pekfos
» 2016-07-07 19:34:07
Dlaczego metoda ma być statyczna?
P-149747
michal11
» 2016-07-07 20:30:41
Jeżeli to jest metoda statyczna to pola jakiego obiektu ma niby modyfikować/odczytywać ?

Możesz przesyłać jako argument tej metody jakiś obiekt tej klasy i na nim operować.
P-149751
mateczek
» 2016-07-07 21:20:48
Metody statyczne mogą tylko działać na składnikach statycznych!!!
Dokładnie opisz problem, może znajdzie się obejście. Bo droga którą próbujesz obrać niezbyt da się zrealizować
P-149754
mimotego
Temat założony przez niniejszego użytkownika
» 2016-07-07 21:35:32
Oto dokładne polecenie: "Zaimplementuj klasę Array posiadającą prywatną tablicę wartości typu int oraz prywatne pole n określające rozmiar tej tablicy. Napisz publiczny konstruktor przyjmujący rozmiar, który dynamicznie utworzy taką tablicę oraz destruktor, który ją usunie.
Napisz statyczną metodę inc przyjmującą w argumencie wartość typu int, która doda tą wartość do wszystkich pól tablicy, we wszystkich istniejących obiektach.
Do klasy można dopisywać pomocnicze pola oraz metody, ale muszą być one prywatne."
P-149755
mateczek
» 2016-07-07 21:59:11
C/C++
#include <iostream>
#include<vector>
class m_class {
    int zwyklySkladnik = 33;
public:
    m_class() {
        tablicaObiektow.push_back( this ); //dodajemy wsaźnik na tworzony obiekt do statycznej tablicy obiejtów
        // przydało by się go usunąć w destruktorze !!!
    }
    static std::vector < m_class *> tablicaObiektow; //statyczny składnik klasy - może być private
    static void metodAdd( int add ); //statyczna metoda dodająca wartość do każdego obiektu, do którego wskaźnik jest zapamiętanego w tablicy obiektów.
    //statyczna metoda musi robić na statycznych składnikach, ale na statycznych składnikach może działać również metoda zwykła!!!
    void displayAll(); //metoda nie musi być static jeśli zadanie nie ma takiego wymogu !!!
};

void m_class::metodAdd( int add ) {
    for( m_class * obj: tablicaObiektow )
         obj->zwyklySkladnik += add;
   
}

void m_class::displayAll() {
    for( m_class * obj: tablicaObiektow )
         std::cout << obj->zwyklySkladnik << std::endl;
   
}

std::vector < m_class *> m_class::tablicaObiektow;

int main() {
   
    m_class m_obj1, mobj_2;
    m_class::metodAdd( 2 ); //wywołanie metody statycznej. metoda statyczna działa na statycznych składnikach
    m_obj1.displayAll(); //wywołanie metody zwykłej. Zwykła metoda może działać na statycznych składnikach
}
P-149757
mimotego
Temat założony przez niniejszego użytkownika
» 2016-07-08 10:41:26
@mateczek wszystko fajnie, tylko Twoje rozwiązanie jest nie do końca zgodnie z treścią zadania. Funkcja ma dodawać wartość podaną w argumencie do każdego elementu tablicy będącej polem klasy. Myślałem nad czymś takim jak stworzenie jeszcze jednej tablicy tym razem ze słówkiem static oraz stworzenie pomocniczej metody, która przypisywałaby adres tej pierwszej tablicy do adresu tablicy static. Jednakże nie mam pojęcia czy takie działania są w ogóle poprawne? Dodatkowo kompilator przy próbie kompilacji wyrzuca
cannot convert ‘int*’ to ‘int**’ in assignment
 i nie za bardzo wiem jak to rozwiązać.
P-149764
michal11
» 2016-07-08 11:18:24
Rozwiązanie @mateczek jest bardzo dobre, pokazuje ogólna zasadę jak masz to zrobić a nie gotowe rozwiązanie, jedyne czego brakuje to usuwanie wskaźników ze statycznego vectora w destruktorze.

Idea rozwiązania twojego problemu to zrobienie dodatkowej statycznej tablicy która przechowuje wskaźniki na każdy stworzony obiekt twojej klasy.
P-149765
« 1 » 2
  Strona 1 z 2 Następna strona