dlaczego nie mogę odwołać się do funkcji w klasie?

0

Chyba jednak nie za bardzo rozumiem klasy... Zrobiłem sobie takie ćwiczenie, chyba proste, ale guzik z tego...

#include <iostream>
#include <string>
#include <list>
using namespace std;
 
class sklep
{
    bool por_stringi(const string &a, const string &b)
    {
        string::const_iterator at=a.begin(), bt=b.begin();
        while(at!=a.end()&&bt!=a.end())
          if(at==a.end()) return true;
          else if(bt==b.end()) return false;
          else if(*at<*bt) return true;
          else if(*at>*bt) return false;
        return false;
    }
    
    struct zabawka
    {
        string nazwa;
        int cena;
        bool comp (const zabawka &a, const zabawka &b)
            {return (por_stringi(a.nazwa,b.nazwa));}
        zabawka(const string &n, int c)
            {nazwa=n; cena=c;}
    };
    struct gra_planszowa
    {
        string nazwa;
        int cena;
        int noty_w_recenzjach;
        bool comp (const gra_planszowa &a, const gra_planszowa &b)
            {return (por_stringi(a.nazwa,b.nazwa));}
        gra_planszowa(string &n, int c, int r)
            {nazwa=n;cena=c;noty_w_recenzjach=r;}
    };
    
    list<zabawka> zabawki; list<gra_planszowa> gry;
    
  public:
    void dod_zabawka (const string &nazwa, int cena)
        {zabawka hlp(nazwa,cena); zabawki.push_back(hlp); return;}
    void dod_gra (const string &nazwa, int cena, int nota)
        {gra_planszowa hlp(nazwa,cena,nota); gry.push_back(hlp); return;}
    
    void drukZabawki()
    {
        zabawki.sort(zabawka::comp);
        for(list<zabawka>iterator it=zabawki.begin();it!=zabawki.end();++it)
            cout << nazwa << " kosztuje " << cena << " zl.\n";
        return;
    }
    void drukGry()
    {
        gry.sort(gra_planszowa::comp);
        for(list<gra_planszowa>iterator it=gry.begin();it!=gry.end();++it)
            cout << nazwa << " kosztuje " << cena
                << " zl, a w recenzji otrzymala ocene " << noty_w_recenzjach
                << " .\n";
        return;
    }
} s;
 
int main()
{
    s.dod_zabawka ("samochodzik", 300); s.dod_zabawka ("mis pluszowy", 50);
    s.dod_zabawka ("klocki Lego", 200); s.dod_zabawka ("pilka", 20);
    
    s.drukZabawki(); return 0;
}
prog.cpp: In member function ‘bool sklep::zabawka::comp(const sklep::zabawka&, const sklep::zabawka&)’:
prog.cpp:24:49: error: cannot call member function ‘bool sklep::por_stringi(const string&, const string&)’ without object
             {return (por_stringi(a.nazwa,b.nazwa));}
                                                 ^
prog.cpp: In member function ‘bool sklep::gra_planszowa::comp(const sklep::gra_planszowa&, const sklep::gra_planszowa&)’:
prog.cpp:34:49: error: cannot call member function ‘bool sklep::por_stringi(const string&, const string&)’ without object
             {return (por_stringi(a.nazwa,b.nazwa));}
                                                 ^
prog.cpp: In member function ‘void sklep::dod_gra(const string&, int, int)’:
prog.cpp:45:43: error: no matching function for call to ‘sklep::gra_planszowa::gra_planszowa(const string&, int&, int&)’
         {gra_planszowa hlp(nazwa,cena,nota); gry.push_back(hlp); return;}
                                           ^
prog.cpp:45:43: note: candidates are:
prog.cpp:35:9: note: sklep::gra_planszowa::gra_planszowa(std::string&, int, int)
         gra_planszowa(string &n, int c, int r)
         ^
prog.cpp:35:9: note:   no known conversion for argument 1 from ‘const string {aka const std::basic_string<char>}’ to ‘std::string& {aka std::basic_string<char>&}’
prog.cpp:28:12: note: sklep::gra_planszowa::gra_planszowa(const sklep::gra_planszowa&)
     struct gra_planszowa
            ^
prog.cpp:28:12: note:   candidate expects 1 argument, 3 provided
prog.cpp: In member function ‘void sklep::drukZabawki()’:
prog.cpp:49:31: error: invalid use of non-static member function ‘bool sklep::zabawka::comp(const sklep::zabawka&, const sklep::zabawka&)’
         zabawki.sort(zabawka::comp);
                               ^
prog.cpp:50:35: error: expected ‘;’ before ‘it’
         for(list<zabawka>iterator it=zabawki.begin();it!=zabawki.end();++it)
                                   ^
prog.cpp:50:35: error: ‘it’ was not declared in this scope
prog.cpp:50:71: error: expected ‘)’ before ‘;’ token
         for(list<zabawka>iterator it=zabawki.begin();it!=zabawki.end();++it)
                                                                       ^
prog.cpp:50:74: error: ‘it’ was not declared in this scope
         for(list<zabawka>iterator it=zabawki.begin();it!=zabawki.end();++it)
                                                                          ^
prog.cpp:50:76: error: expected ‘;’ before ‘)’ token
         for(list<zabawka>iterator it=zabawki.begin();it!=zabawki.end();++it)
                                                                            ^
prog.cpp: In member function ‘void sklep::drukGry()’:
prog.cpp:56:33: error: invalid use of non-static member function ‘bool sklep::gra_planszowa::comp(const sklep::gra_planszowa&, const sklep::gra_planszowa&)’
         gry.sort(gra_planszowa::comp);
                                 ^
prog.cpp:57:41: error: expected ‘;’ before ‘it’
         for(list<gra_planszowa>iterator it=gry.begin();it!=gry.end();++it)
                                         ^
prog.cpp:57:41: error: ‘it’ was not declared in this scope
prog.cpp:57:69: error: expected ‘)’ before ‘;’ token
         for(list<gra_planszowa>iterator it=gry.begin();it!=gry.end();++it)
                                                                     ^
prog.cpp:57:72: error: ‘it’ was not declared in this scope
         for(list<gra_planszowa>iterator it=gry.begin();it!=gry.end();++it)
                                                                        ^
prog.cpp:57:74: error: expected ‘;’ before ‘)’ token
         for(list<gra_planszowa>iterator it=gry.begin();it!=gry.end();++it)
                                                                          ^

http://ideone.com/5fTHWI

O co tu chodzi?

0

O wtf>< Może napisz treść zadania ? I lepiej napisz to od nowa?

0

comp (obie) muszą być funkcjami zewnętrznymi lub składowymi statycznymi.
Wskaźnik na metodę nie jest tym samym co wskaźnik na funkcje.

0

Ćwiczenie wymyśliłem sam.

@_13th_Dragon, ok, ale to bez sensu... po co w ogóle zamykać wszystko w klasie, skoro banalną funkcję porównującą muszę wstawić poza klasą? Dla mnie to nielogiczne: aby móc sortować listę wewnętrzną dla danej klasy, muszę utworzyć funkcję porównującą zdefiniowaną poza klasą?

1 użytkowników online, w tym zalogowanych: 0, gości: 1