Code:
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;
}
}
Calling this function raises an error in compile time:
undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'
I tried every case without and with inline
symbol:
inline
in header, not in 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
in header, also in 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
not in header, but in cpp:
undefined reference to `Point3f::project2D(ProjType, Point2i const&) const'|
inline
not in header, neither in cpp:
It works but that's not what I want
Question:
const and inline member function
make sense?const and inline member function
?Thanks in advance.
The function being const
has nothing to do with it. If you want it inline
, you must define it in the header file instead of in point3f.cpp
. Example:
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;
}
}
};
In this case, the inline
keyword is not needed at all. If you define the function inside the class definition, inline
is the default. But you can still specify it, if you want (as I've done in the above example.)
Im teste this and work fine! this example can be viewd at: http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap7.html
Example 24: Overloading an operator/function with respect to const-ness
#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
}
hope with help!
peace and light!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With