2012-10-27 13 views
5

Kod:Jak zadeklarować i zaimplementować funkcję const i inline member?

point3f.h

Class Point3f { 
    ... 
    inline void project2D(ProjType p, const Point2i& view) const; 
}; 

point3f.cpp

inline void Point3f::project2D(ProjType p, const Point2i& view) const { 
    switch(p) { 
     case PROJ_XY: 
      glVertex2f(x * view.x, y * view.y); 
      break; 
     case PROJ_YZ: 
      glVertex2f(y * view.x, z * view.y); 
      break; 
     case PROJ_XZ: 
      glVertex2f(x * view.x, z * view.y); 
      break; 
     default: 
      break; 
    } 
} 

Wywołanie tej funkcji powoduje błąd w czasie kompilacji:

undefined reference to `Point3f::project2D(ProjType, Point2i const&) const' 

Próbowałem każdy przypadek bez i symbolem inline:

inline w nagłówku, a nie w cpp:

Warning: inline function ‘void Point3f::project2D(ProjType, const Point2i&) const’ used but never defined [enabled by default 
undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'| 

inline w nagłówku, również w KPP:

Warning: inline function ‘void Point3f::project2D(ProjType, const Point2i&) const’ used but never defined [enabled by default 
undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'| 

inline nie w nagłówku, ale w KPP:

undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'| 

inline nie w nagłówku, ani w cpp:

It works but that's not what I want 

Pytanie:

  1. Czy const and inline member function sens?
  2. Jak zadeklarować const and inline member function?

Z góry dziękuję.

Odpowiedz

5

Funkcja o numerze const nie ma z tym nic wspólnego. Jeśli chcesz go ustawić, musisz zdefiniować go w pliku nagłówkowym zamiast w point3f.cpp. Przykład:

class Point3f { 
    ... 
    inline void project2D(ProjType p, const Point2i& view) const 
    { 
     switch(p) { 
     case PROJ_XY: 
      glVertex2f(x * view.x, y * view.y); 
      break; 
     case PROJ_YZ: 
      glVertex2f(y * view.x, z * view.y); 
      break; 
     case PROJ_XZ: 
      glVertex2f(x * view.x, z * view.y); 
      break; 
     default: 
      break; 
     } 
    } 
}; 

W tym przypadku kluczowe inline nie jest w ogóle potrzebne. Jeśli zdefiniujesz funkcję w definicji klasy, domyślną jest inline. Ale nadal możesz go określić, jeśli chcesz (tak jak to zrobiłem w powyższym przykładzie).

+0

Aby wyjaśnić, problem nie polega na mieszaniu 'const' i' inline' (robię to przez cały czas), ale w tym, że 'inline' musi znajdować się w pliku nagłówkowym. –

+0

Podążając za tym, co powiedziałeś, g ++ podnosi tylko inne ostrzeżenie, że 'warning: funkcja inline 'void Point3f :: project2D (ProjType, const Point2i &) const' użyte, ale nigdy nie zdefiniowane [włączone domyślnie]' –

+0

@ComboZhc Nie wkładaj funkcja w pliku .cpp w ogóle. Umieść go * tylko * w nagłówku. –

0

Użytkownik zadeklarował go jako wstawiony w pliku cpp, dlatego nie jest emitowany żaden symbol, w point3f.cpp zawsze jest on wstawiony. Ale inne pliki, które zawierają nagłówek, nie mają możliwości wbudowania funkcji, potrzebują tego symbolu do emisji. Przypuszczam, że tak jest w tym przypadku.

1

Testuję to i działam dobrze! tym przykładzie można viewd w: http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap7.html

Przykład 24: Przeciążenie to, aby operator/funkcji w odniesieniu do const-ności

#include <iostream.h> 
    #include <string.h> 
    static unsigned const cSize = 1024; 
    class InternalData {}; 

    class Buffer 
    { 
     public: 
     Buffer(char* cp); 

     // Inline functions in this class are written compactly so the example 
     // may fit on one page. THIS is NOT to be done in practice (See Rule 21). 

     // A. non-const member functions: result is an lvalue 
     char& operator[](unsigned index) { return buffer[index]; } 
     InternalData& get() { return data; } 

     // B. const member functions: result is not an lvalue 
     char operator[](unsigned index) const { return buffer[index]; } 
     const InternalData& get() const { return data; } 

     private: 
     char buffer[cSize]; 
     InternalData data; 
    }; 

    inline Buffer::Buffer(char* cp) 
    { 
     strncpy(buffer , cp , sizeof(buffer)); 
    } 

    main() 
    { 
     const Buffer cfoo = "peter";// This is a constant buffer 
     Buffer foo = "mary";// This buffer can change 

     foo[2]='c';// calls char& Buffer::operator[](unsigned) 
     cfoo[2] = 'c' // ERROR: cfoo[2] is not an lvalue. 

     // cfoo[2] means that Buffer::operator[](unsigned) const is called. 

     cout << cfoo[2] << ":" << foo[2] << endl; // OK! Only rvalues are needed 

     foo.get() = cfoo.get(); 
     cfoo.get() = foo.get(); // ERROR: cfoo.get() is not an lvalue 
    } 

nadzieję przy pomocy!

Pokój i światło!

Powiązane problemy