Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

pokazivaci na funkcije clanice

[es] :: C/C++ programiranje :: C/C++ za početnike :: pokazivaci na funkcije clanice

[ Pregleda: 2874 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon pokazivaci na funkcije clanice05.05.2011. u 11:11 - pre 157 meseci
Ne mogu nikako da pokrenem ovaj program, stalno mi pokazuje sledecu gresku
Code:
 
70  invalid use of non-static member function `virtual void Mammal::Speak() const' 
70  cannot convert `void (Mammal::)() const' to `void (Mammal::*)() const' in assignment 
71  invalid use of non-static member function `virtual void Mammal::Move() const' 
71  cannot convert `void (Mammal::)() const' to `void (Mammal::*)() const' in assignment 

Ovo izbaci kad pokusam da kompajliram na dev-c++. Kada pokusam na g++ svodi se na isto, opet "invalid use of non-static member function"

Sledeci kod je u pitanju:

Code:
 
#include <iostream>
using namespace std;

class Mammal
{
    public:
        Mammal():itsAge(1) {}
        virtual ~Mammal() {}
        virtual void Speak() const = 0;
        virtual void Move() const = 0;
    protected:
        int itsAge;
};

class Dog : public Mammal
{
    public:
        void Speak() const { cout << "Vau!\n"; }
        void Move() const { cout << "Hodam na petama.\n"; }
};

class Cat : public Mammal
{
    public:
        void Speak() const { cout << "Mjauu.\n"; }
        void Move() const { cout << "Sunjam se.\n"; }
};

class Horse : public Mammal
{
    public:
        void Speak() const { cout << "Njistim.\n" ;}
        void Move() const { cout << "Galopiram.\n"; }
};

int main()
{
    void (Mammal::*pFuncMemb)() const = 0;
    Mammal* ptr=NULL;
    bool fQuit=false;
    int Animal;
    int Method;
    
    while (fQuit==false)
    {
        cout << "(0) Izlaz (1) Pas (2) Macka (3) Konj: ";
        cin >> Animal;
        switch(Animal)
        {
            case 1:
                ptr=new Dog;
                break;
            case 2:
                ptr=new Cat;
                break;
            case 3:
                ptr=new Horse;
                break;
            default:
                fQuit=true;
                break;
        }
        if (fQuit)
            break;
        
        cout << "(1) Govori (2) Pomeri se: ";
        cin >> Method;
        switch(Method)
        {
            case 1: pFuncMemb = Mammal::Speak; break;
            default:pFuncMemb = Mammal::Move; break;
        }
        
        (ptr->*pFuncMemb)();
        delete ptr;
    }
    return 0;
}


Mislim da je jasno sta program da radi poenta mi je samo da shvatim neke stvari oko pokazivaca i zasto konkretno ovaj program ne radi.

PS: Potrazio sam i po forumu i koliko sam video kodovi se svode na isto tako da ne znam gde gresim.
 
Odgovor na temu

srelex
Novi Sad

Član broj: 283809
Poruke: 16
*.dynamic.sbb.rs.



Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 11:33 - pre 157 meseci
Greska ti je u ovom delu:

Code:
 cin >> Method;
        switch(Method)
        {
            case 1: pFuncMemb = Mammal::Speak; break;
            default:pFuncMemb = Mammal::Move; break;
        }


treba

Code:
 cin >> Method;
        switch(Method)
        {
            case 1: pFuncMemb = & Mammal::Speak; break;
            default:pFuncMemb = & Mammal::Move; break;
        }


jer je pFuncMemb pokazivac,pa mu trebas dodeliti adresu metode.
 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 11:46 - pre 157 meseci
Sad radi. Hvala. Program je zaista smesan, ali dobar primer. Znaci li to da svaki put ispred metode stavljam & ukoliko je funkcija clanica neke klase?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 12:26 - pre 157 meseci
Stavljaš & kad ti treba adresa. Pointer mora da pokazuje na adresu.
 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 15:49 - pre 157 meseci
Da to znam zasto ide &. Ali ne razumem zasto samo kod clanica klase mora da se stavi &. Kad se pokazivac stavlja na obicnu funkciju ide
Code:
pFnc=NekaFunkcija;


Cak ni zagrade. Zato mi je cudno &
 
Odgovor na temu

srelex
Novi Sad

Član broj: 283809
Poruke: 16
*.dynamic.sbb.rs.



Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 16:01 - pre 157 meseci
Citat:
SpreX: Da to znam zasto ide &. Ali ne razumem zasto samo kod clanica klase mora da se stavi &. Kad se pokazivac stavlja na obicnu funkciju ide
Code:
pFnc=NekaFunkcija;


Cak ni zagrade. Zato mi je cudno &


ovo mozes da uradis jedino ako ta funkcija vraca neku adresu.. npr

Code:


int* NekaFunkcija(){}


int* pFnc=NULL;

pFnc=NekaFunkcija();



u tvom primeru se radi o tome da se preko pokazivaca poziva metoda(funkcija).
Znaci prvo trebas da dodelis adresu tvoje motode pokazivacu,zatim kada pozoves pokazivac on ce da pozove ustvari adresu koja je smestena u tvom pokazivacu(a to je metoda na koju su prethodno postavio da pokazuje tvoj pokazivac).

u pitanju je univerzalna stvar kako se dodeljuje adresa funkcije pokazivacu,bez obzira da li se radi o funkciji clanici nekog objekta ili pak slobodnoj funkciji.


 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 16:25 - pre 157 meseci
Uporno gledam prethodne kodove koji su radili i nigde nisam naisao na objasnjenje da mora da se stavi &

Recimo ovo:

Code:

#include <iostream>
using namespace std;

void Square(int&,int&);
void Cube(int&,int&);
void Swap(int&,int&);
void GetVals(int&,int&);
void PrintVals(int, int);

int main()
{
    void (*pFunc) (int&,int&);
    bool fQuit=false;
    int valOne=1;int valTwo=2;
    int choice;
    
    while (fQuit==false)
    {
        cout << "(0)Izlaz (1)Promena vrednosti (2)Kvadrat (3)Kub (4)Zamena: ";
        cin >> choice;
        
        switch(choice)
        {
            case 1:pFunc=GetVals;break;
            case 2:pFunc=Square;break;
            case 3:pFunc=Cube;break;
            case 4:pFunc=Swap;break;
            default:fQuit=true;break;
        }
        if (fQuit)
            break;
        
        PrintVals(valOne,valTwo);
        pFunc(valOne,valTwo);
        PrintVals(valOne,valTwo);
    }
    return 0;
}

void PrintVals(int x, int y)
{
    cout << "x: " << x << " y: " << y << endl;
}

void Square(int& rx, int& ry)
{
    rx*=rx;
    ry*=ry;
}

void Cube(int&rx, int& ry)
{
    int tmp;
    tmp = rx;
    rx*=rx;
    rx=rx*tmp;
    
    tmp=ry;
    ry*=ry;
    ry=ry*tmp;
}

void Swap(int& rx, int& ry)
{
    int tmp;
    tmp=ry;
    ry=rx;
    rx=tmp;
}

void GetVals(int& rValOne, int& rValTwo)
{
    cout << "Nova vrednost promenljive valOne je: ";
    cin >> rValOne;
    cout << "Nova vrednost promenljive valTwo je: ";
    cin >> rValTwo;
}


Posto su parametri funkcije reference, znaci vratice se vrednost. Ako si na to mislio onda mi je jasno, ali to nije bilo navedeno u knjizi pa prvi put cujem za to. Mada je skroz logicno. Hvala na objasnjenju.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 16:31 - pre 157 meseci
U ranijim verzijama C++ standarda nije moralo, nego se funkcija i &funkcija isto tretiralo, ali u novijim verzijama izostavljanje & treba da napravi grešku u kompajleru, čak i u slučaju koji ti trenutno radi.

I znak & nema veze sa tim šta funkcija vraća, jer ne koristiš povratnu vrednost funkcije, nego samu adresu funkcije.
 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 16:33 - pre 157 meseci
Znaci bez obzira sto su parametri reference pa ce se adresa dodeliti pokazivacu? Trebalo bi navesti & u svakom slucaju?

PS: Parametri funkcije su reference. Ukoliko bi samo bilo promenljive funkcija bi morala da vraca vrednost int, a u ovom slucaju ne mora. Naravno da je & vezano za adresu funkcije, ali nisam siguran da se bas razumemo.
Ako tako gledas obe funkcije su void, a jedan program radi a drugi ne. Ajd objasni mi kako?
To sto ima reference ne znaci nikako da se vrednost prosledjuje u main funkciju, ali hocu da kazem da ce se ipak pomocu onih referenci (parametri funkcije) izmeniti neke vrednosti u glavnoj funkciji main(), jel tako (neke vrednosti su u ovom slucaju valOne i valTwo)?

Da li je to jedini razlog zbog kog ovo drugo radi, a onaj prvi program ne?

[Ovu poruku je menjao SpreX dana 05.05.2011. u 17:50 GMT+1]
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 16:48 - pre 157 meseci
Ne razumem pitanje, ali prethodni odgovor još važi :-)
 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 16:57 - pre 157 meseci
:)
Ajd da probam ovako. Parametri funkcije su reference. Zbog cega ne bismo stavili obicne promenljive, a ne reference?
Zato sto onda ne bi funkcija mogla vracati vrednost tipa void, nego int jel tako?
U svakom slucaju bi morala da vraca vrednost.

Kazes da funkcija mora da vraca vrednost da bi onaj moj program (drugi) radio.
Poenta je da ni jedna funkcija ne vraca neku vrednost (sve su void) a drugi program radi, a prvi ne.
To me interesuje zasto?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 20:08 - pre 157 meseci
Ne bi mogla? Zašto ne bi mogla? Parametri funkcije uopšte nemaju nikakve veze sa povratnom vrednošću funkcije. Sve kombinacije su dozvoljene:

void f1(int&);
int f2(void);
int& f3(int);

Ja nisam kazao da funkcija mora da vraća vrednost da bi mogao da se koristi pointer na funkciju. To je srelex rekao, ali nije bio u pravu. Od bilo koje funkcije može da se uzme adresa, da bi se dodelila pointeru. Povratna vrednost funkcije ne može da bude void samo ako... hoćeš da imaš povratnu vrednost, to jest samo u slučaju x = f(). Za slučaj x = &f funkcija može da bude bilo kakva.
 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.dynamic.sbb.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 20:37 - pre 157 meseci
Parametri nemaju veze, ali kazem jer kako bi se drugacije vratila vrednost iz one funkcije Square().
Razumes sta hocu da kazem? Morali bi staviti da se vracaju vrednosti u main() funkciju a to bi znacilo da vise nije void.
Sad sam video da je napisao srelex. Nisam znao da je netacno, zato sam i pitao.

Znam to za adresu sa &, ali me interesuje zbog cega mi program gde je pokazivac na funkciju clanicu klase radi
tek kad stavim & u
Code:

pFunc=& NekaKlasa::Funkcija();

U programu gde funkcija nije clanica klase radi sa
pFunc=NekaFunkcija;

Ono sa adresom radi, ok, ali zasto onaj gde nisam naveo & takodje radi, a program gde je f-ja clanica klase mora da ima &?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 21:55 - pre 157 meseci
Nemam pojma zašto. Bolje uvek koristi & i nastavi dalje bez udubljivanja.
 
Odgovor na temu

SpreX
Sombor

Član broj: 166398
Poruke: 25
*.mbb.telenor.rs.

ICQ: 471546674


+1 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 22:02 - pre 157 meseci
Shvatam. Hvala za ovo. Dosta mi je pojasnilo stvari.
 
Odgovor na temu

srelex
Novi Sad

Član broj: 283809
Poruke: 16
*.dynamic.sbb.rs.



Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 22:24 - pre 157 meseci
Citat:
Mihajlo Cvetanović: Ne bi mogla? Zašto ne bi mogla? Parametri funkcije uopšte nemaju nikakve veze sa povratnom vrednošću funkcije. Sve kombinacije su dozvoljene:

void f1(int&);
int f2(void);
int& f3(int);

Ja nisam kazao da funkcija mora da vraća vrednost da bi mogao da se koristi pointer na funkciju. To je srelex rekao, ali nije bio u pravu. Od bilo koje funkcije može da se uzme adresa, da bi se dodelila pointeru. Povratna vrednost funkcije ne može da bude void samo ako... hoćeš da imaš povratnu vrednost, to jest samo u slučaju x = f(). Za slučaj x = &f funkcija može da bude bilo kakva.


ma nisam to mislio,lose sam ga shvatio sta pita i jos gore objasnio

mislim da ti prvi program ne radi jer su funkcije
virtual void Speak() const = 0;
virtual void Speak() const = 0;

pa kad ti napises

pFuncMemb = Mammal::Speak;

on pokusa da dodeli tu 0 pokazivacu pa zato javi gresku...Moje misljenje..
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: pokazivaci na funkcije clanice05.05.2011. u 23:21 - pre 157 meseci
Nema to veze. Sa tom nulom se označava deklaracija čiste virtuelne funkcije, to jest funkcije koja nema definiciju u datoj klasi, nego mora da ima u nekoj koja je izvedena iz date. Klasa sa čistim virtuelnim funkcijama ne može da se instancira, ali ona izvedena koja ima definisane sve funkcije može. U C# su uveli ključnu reč abstract za to, ali odbor za C++ standard ne želi da uvodi ključne reči ako baš ne mora, pa je zato ponekad sintaksa tako malo rogobatna.
 
Odgovor na temu

Lazar-I

Član broj: 6950
Poruke: 169
*.dynamic.isp.telekom.rs.



+727 Profil

icon Re: pokazivaci na funkcije clanice06.05.2011. u 10:52 - pre 157 meseci
Citat:
Ovo izbaci kad pokusam da kompajliram na dev-c++. Kada pokusam na g++ svodi se na isto


Dev-c++ nije kompajler nego je IDE, kada "kompajliraš na dev-c++" ti takođe koristiš mingw.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: pokazivaci na funkcije clanice

[ Pregleda: 2874 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.