2015-03-26 36 views
6

mam coś takiego:nieprawidłowe użycie non-statycznej funkcji składowej

class Bar 
     { 
     public: 
     pair<string,string> one; 
     std::vector<string> cars; 
     Bar(string one, string two, string car); 
     }; 

class Car 
     { 
     public: 
     string rz; 
     Bar* owner; 
     Car(string car, Bar* p); 
     }; 

class Foo 
     { 
     public: 
      Foo (void); 
      ~Foo (void); 
      int Count (const string & one, const string & two) const; 
      int comparator (const Bar & first, const Bar & second) const;    
      std::vector<Bar> bars; 
     }; 

int Foo::comparator(const Bar & first, const Bar & second) const{ 
    return first.name < second.name; 
} 

int Foo::Count (const string & one, const string & two) const{ 
    int result=0; 
    Bar mybar = Bar(one, two, ""); 
    std::vector<Bar>::iterator ToFind = lower_bound(bars.begin(), bars.end(), mybar, comparator); 
    if (ToFind != bars.end() && ToFind->one == mybar.one){ 
    result = ... 
    } 
    return result; 
} 

Metoda Foo::Count powinny stosować std::lower_bound() znaleźć element vector<Bar> zgodnie z pary dwóch ciągów. Teraz część, która nie działa. Do lower_bound() Dostarczam metodę comparator(). Myślałem, że to było w porządku, ale g ++ mówi:

c.cpp: In member function ‘int Foo::Count(const string&, const string&) const’: 
c.cpp:42:94: error: invalid use of non-static member function 
std::vector<Bar>::iterator ToFind = lower_bound(bars.begin(), bars.end(), mybar, comparator); 

A metoda Count() musi pozostać const ...

Jestem całkiem nowe do C++, ponieważ jestem zmuszony go nauczyć.

Wszelkie pomysły?

+0

Dlaczego ta funkcja nie jest statyczna? – chris

+0

Który? Nie wolno mi zmieniać deklaracji funkcji Count() – Nash

Odpowiedz

3

Należy wykonać statyczne lub zawinąć w obiekt klasy w obiekcie klasy . Dzieje się tak, ponieważ lower_bounds oczekuje, że komparator będzie klasą obiektu, który ma operator wywołania, jak wskaźnik funkcji lub obiekt funktora. Ponadto, jeśli używasz C++ 11 lub nowszego, możesz także wykonać polecenie jako dwcanillas i użyć funkcji lambda. C++ 11 również ma std::bind.

Przykłady:

// Binding: 
std::lower_bounds(first, last, value, std::bind(&Foo::comparitor, this, _1, _2)); 
// Lambda: 
std::lower_bounds(first, last, value, [](const Bar & first, const Bar & second) { return ...; }); 
+1

Lub użyć funkcji lambda. – dwcanillas

+0

Dobra, teraz rozumiem. Dziękuję bardzo! – Nash

+1

Nie ma za co. Chciałbym powiedzieć, że funkcja porównania jest statyczna, ponieważ nie ma dostępu do klasy. –

0

Będziesz zdać this wskaźnik powiedzieć funkcję który obiekt do pracy, ponieważ opiera się na tym, w przeciwieństwie do funkcji static członkowskim.

6

Najprostszą jest, aby funkcja komparator być statyczne:

static int comparator (const Bar & first, const Bar & second); 
^^^^^^ 

Kiedy powołując go w Count, jego nazwa będzie Foo::comparator.

Sposób, w jaki jest to teraz, nie ma sensu być niestatyczną funkcją członkowską, ponieważ nie używa żadnych zmiennych członkowskich o wartości Foo.

Inną opcją jest uczynienie jej funkcją nie będącą członkiem, zwłaszcza jeśli ma sens, aby ten komparator mógł być używany przez inny kod oprócz tylko Foo.