[C++] Dziedziczenie - co tu jest nie tak?

Witam,

mam taki oto kod:

#include 


using namespace std;


class a{

    public:

        static int liczba1 = 0;

}


class b: public a{

    public:

        void func(){

            liczba1=1;

        }

}


int func()

{

    b.hmhm();

    cout << liczba1 << endl;

    return 0;

}

Gdy próbuję go uruchomić wyświetlają się błędy:

Co ja robię źle?

Z góry dzięki.

Pozdrawiam.

Pozwolę sobie przekopiować tu tę część, na którą należy zwrócić uwagę

ISO C++ forbids in-class initialization of non-const static member 'liczba1'

Właśnie w tym leży problem: co jest nie tak?

class a{

    public:

        int liczba1;

		a()

		{liczba1=0;}

};


class b: public a{

    public:

        void func(){

            liczba1=1;

        }

};

taka konstrukcja

public:

       static int liczba1=1;

nie jest dozwolona (chyba że dodasz const), a tak poza tym średniki na “końcach” klas

Nadal to jednak nie rozwiązało problemu gdyż wciąż nie działa :confused:

#include 


using namespace std;


class a{

    public:

        static int liczba1;

};


class b: public a{

    public:

        void func(){

            liczba1=1;

            cout << liczba1 << endl;

        }

};


int main(){

    b.func();

    return 0;

}

Wywołujesz metodę obiektu na “b”, a b to klasa. Albo metoda func miała być statyczna, ale chciałeś utworzyć obiekt klasy b i na nim wywołać niestatyczną metodę.

chciałem zrobić coś takiego, że tworzę zmienną w klasie a, a potem modyfikuję wartość zmiennej w klasie b i na koniec wszystko wyświetlam…

#include 


using namespace std;


class a{

    public:

        int liczba1;

};


class b: public a{

    public:

        void func(){

            liczba1=1;

            cout << liczba1 << endl;

        }

};


int main(){

    b obiekt;

    obiekt.func();

    system("PAUSE");

    return 0;

}

O to chodziło?

Tak, dzięki :slight_smile:

jednak pojawił się nastepny problem:

mam funkcję odpowiadającą za obslugę zmiany wielkości okna:

glutReshapeFunc(&ReSizeGLScene);

Jednak chciałem, żeby funkcja ResizeGLScene byla w innej klasie. jak to zrobić żeby byl taki sam efekt jak w tym kodzie? :slight_smile: jak robię tak:

glutReshapeFunc(&okno::ReSizeGLScene);

To wyskakuje:

:expressionless:

Aby przekazać do funkcji wskaźnik do metody z innej klasy w ten sposób:

glutReshapeFunc(&okno::ReSizeGLScene);

to prototyp funkcji musiałby wyglądać np. tak:

void glutReshapeFunc(void (okno::*funkcja)());

Żeby teraz uruchomić w funkcji glutReshapeFunc funkcję przekazaną przez parametr, to musi być w niej widoczny obiekt klasy, z której pochodzi nowa funkcja:

okno *obiekt = new okno;

obiekt->*funkcja();

Wydaje mi się, że w ten sposób powinno zadziałać.

Sorry za odkop ale dopiero teraz do tego wróciłem, bo wcześniej mi się nie udawało więc odłożyłem na później.

Teraz jednak tego potrzebuję:

zrobiłem coś takiego (poza funkcjami):

(Sterowanie to klasa)

Sterowanie *obiekt = new Sterowanie;

obiekt->*keyPressed();

A w odpowiedniej funkcji to:

glutKeyboardFunc(&obiekt);

Kawałek funkcji keyPressed():

void keyPressed(unsigned char key, int x, int y)

{ [...] }

No i wyskakuje błąd:

Compiling: main.cpp

M:\C++ projekty\Wyscigi1\main.cpp:43: error: expected constructor, destructor, or type conversion before '->*' token

M:\C++ projekty\Wyscigi1\main.cpp: In function 'int main(int, char**)':

M:\C++ projekty\Wyscigi1\main.cpp:118: error: cannot convert 'Sterowanie**' to 'void (*)(unsigned char, int, int)' for argument '1' to 'void glutKeyboardFunc(void (*)(unsigned char, int, int))'

Co ja robię źle?

error: cannot convert 'Sterowanie**' to 'void (*)(unsigned char, int, int)' for argument '1' to 'void glutKeyboardFunc(void (*)(unsigned char, int, int))'

glutKeyboardFunc przyjmuje jeden argument - wskaźnik na funkcję, takiego typu: void (*)(unsigned char, int, int)

Ty natomiast próbujesz tam przekazać wskaźnik na wskaźnik do obiektu typu Sterowanie, co jest bez sensu i kompilator mówi Ci, że nie może skonwertować ‘wskaźnik na wskaźnik’ na ‘wskaźnik na funkcję …’.

Widzę jednak, że masz funkcję o takim typie - keyPressed. Nie chodziło Ci więc o glutKeyboardFunc(&keyPressed) ?

Chodzi mi o wywołanie funkcji keyPressed.

Czyli chodzi mi o to:

glutKeyboardFunc(&keyPressed)

Czyli jak mam zrobić? EDIT To było źle:

Eeee… no to sam wiesz co chcesz zrobić, czy nie?

Funkcja glutKeyboardFunc przyjmuje funkcję. Podałeś, że masz funkcję o takich parametrach i typie zwracanym - keyPressed - więc domyślam się, że to właśnie ją chciałeś przekazać - co zasugerowałem.

Sorry albo ja cie nie rozumiem albo na odwrót albo i to i to.

może prościej będzie jak powiesz jak to ma w takim razie wyglądać.

Nie jestem w stanie, musiałbyś dać więcej Twojego kodu i jakoś go opisać. Postaram się napisać prosto w punktach co chciałem przekazać:

  1. Masz funkcję void glutKeyboardFunc(void (*)(unsigned char, int, int)) - jak widać, trzeba jej przekazać wskaźnik na funkcję: void (*)(unsigned char, int, int)

  2. Próbowałeś przekazać tam wskaźnik na wskaźnik na obiekt klasy Sterowanie, co oczywiście nie ma prawa zadziałać

  3. Napisałeś, że masz funkcję void keyPressed(unsigned char key, int x, int y)

  4. Jest ona dokładnie typu, który przyjmuje glutKeyboardFunc, więc _domyślam_się_, że to ją chciałeś przekazać (ale nie ja piszę ten kod, to Ty powinieneś wiedzieć co chcesz zrobić)

  5. Jeśli tak jest, to wtedy wystarczyłoby napisać

    glutKeyboardFunc(&keyPressed);

Wracając na moment do poprzedniego tematu:

Nie w tym jest problem. Problemem jest “static”. Otóż można mieć pole statyczne i zainicjalizowane.

#include 

using namespace std;


class A {

public:

    static int liczba;

};


int A::liczba = 0;


class B : public A {

public:

    static void func1() {

        liczba = 1;

    }


    void func2() {

        liczba = 2;

    }

};


int main() {

    B::func1();

    cout << A::liczba << endl;


    B b;

    b.func2();

    cout << A::liczba << endl;

    return 0;

}